百度地图

慕课视频:Android-百度地图之导航
http://www.imooc.com/learn/670
Android 百度地图 SDK v3.0.0
转载链接【鸿神】:http://blog.csdn.net/lmj623565791/article/category/2392939
Android:百度地图 点聚合功能
http://m.blog.csdn.net/article/details?id=52386097
百度地图应用实例操作
http://m.blog.csdn.net/blog/index?username=rt77777
android 获取GPS经纬度在百度地图上绘制轨迹
http://m.blog.csdn.net/article/details?id=17842697
百度地图应用实例
http://www.jianshu.com/p/ade5f2a7f320
Android地图开发
http://blog.csdn.net/column/details/android-jacksen-map.html
百度地图开发之实现运动轨迹 <一>
http://blog.csdn.net/u013430507/article/details/44064761
百度地图开发之实现运动轨迹 <二>
http://blog.csdn.net/u013430507/article/details/44065409
Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
http://blog.csdn.net/u013430507/article/details/44065765
百度地图开发文档地址
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
程序包api文档
http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_3_0/index.html
《一》生成SHA1时注意:
keytool的使用:目录下的keytool全路名
dubug版:keytool -list -v -keystore debug.keystore
注意:debug.keystore(默认没有口令)
上线版:keytool -list -v -keystore 123.jks
口令就是keystore的密码
《二》复制jar包
(1)直接复制BaiduMap_AndroidSDK_v4.2.1_Sample\BaiduMapsApiDemo\libs
目录下的jar包《除去v4》
(2) 生成并粘贴main/jniLibs下面的so文件(5个)
《三》配置功能清单文件
权限以及《meta-data》替换成自己应用生成的value值(key)
《四》布局layout中添加map组件
《五》添加图层
获取地图的实例
//添加交通图
mapView.setTrafficEnabled(true);
//mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
/* //普通地图
mapView.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星地图
mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,将不会使用流量下载基础地图瓦片图层。
// 使用场景:与瓦片图层一起使用,节省流量,提升自定义瓦片图下载速度。
mapView.setMapType(BaiduMap.MAP_TYPE_NONE);
//开启交通图 实时交通图
mapView.setTrafficEnabled(true);
//开启交通图 百度城市热力图
mapView.setBaiduHeatMapEnabled(true);
《六》添加覆盖物
//设置地图点击事件
mapView.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {//坐标
mapView.clear();//清除地图上的所有的覆盖物
//创建一个覆盖物的图标
BitmapDescriptor icon = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher);
//创建一个覆盖物
OverlayOptions options =
new MarkerOptions().position(latLng).icon(icon);
//将覆盖物添加到地图中
mapView.addOverlay(options);
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
《七》添加覆盖物的点击事件
mapView.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Toast.makeText(MainActivity.this, "别点我讨厌!!", Toast.LENGTH_SHORT).show();
return false;
}
});
完整代码:
public class MainActivity extends AppCompatActivity {

private BaiduMap mapView;
private MapView map;
private PoiSearch poiSearch;
private ShareUrlSearch shareUrlSearch;
private RoutePlanSearch routePlanSearch;
private GeoCoder geoCoder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //在使用SDK各组件之前初始化context信息,传入ApplicationContext
    //注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    setContentView(R.layout.activity_main);

    initView();

    initListener();

}

private void initListener() {
    //添加地图的事件
    //initMapListener();
    //添加marker点击事件
    //initMarkerListener();
    //检索监听
    initPoiListener();
    //设置分享监听
    initShareListener();
    //创建线路规划监听
    initRoutePlanListener();
    //地理编码
    initGeoCoderListener();
}

private void initGeoCoderListener() {
    geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
        @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
            Log.i("TAG", "onGetGeoCodeResult: "+geoCodeResult.getLocation().toString());
        }

        @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            String address = reverseGeoCodeResult.getAddress();
            Log.i("TAG", "onGetGeoCodeResult: ");
        }
    });
}

private void initRoutePlanListener() {
    routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
        @Override
        public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {

            //步行路线结果回调
            if (walkingRouteResult == null ||
                    walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
                return;
            }
            mapView.clear();

            WalkingRouteOverlay overly = new MyWalk(mapView);

            overly.setData(walkingRouteResult.getRouteLines().get(0));
            overly.addToMap();
            overly.zoomToSpan();
        }

        @Override
        public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
            //换乘路线结果回调
        }

        @Override
        public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
            //跨城公共交通路线结果回调
        }

        @Override
        public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
            //驾车路线结果回调
            //骑行路线回调
            if (drivingRouteResult == null ||
                    drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
                return;
            }
            mapView.clear();
            DrivingRouteOverlay overlay = new MyDriver(mapView);
            overlay.setData(drivingRouteResult.getRouteLines().get(0));
            overlay.addToMap();
            overlay.zoomToSpan();
        }

        @Override
        public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
            //室内路线规划回调
        }

        @Override
        public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

            //骑行路线结果回调
            if (bikingRouteResult == null ||
                    bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
                return;
            }
            mapView.clear();
            BikingRouteOverlay overlay = new MyBinking(mapView);
            overlay.setData(bikingRouteResult.getRouteLines().get(0));
            overlay.addToMap();
            overlay.zoomToSpan();
        }
    });
}

//创建步行路线覆盖物
class MyWalk extends WalkingRouteOverlay {
    public MyWalk(BaiduMap baiduMap) {
        super(baiduMap);
    }
    @Override
    public boolean onPolylineClick(Polyline polyline) {
        return super.onPolylineClick(polyline);
    }
}


//创建架车路线覆盖物
class MyDriver extends DrivingRouteOverlay {
    public MyDriver(BaiduMap baiduMap) {
        super(baiduMap);
    }
}
//创建步行路线覆盖物
class MyBinking extends BikingRouteOverlay {

    public MyBinking(BaiduMap baiduMap) {
        super(baiduMap);
    }
}

//=======分享的第二个回调(shareUrl)==>url=====
private void initShareListener() {
shareUrlSearch.setOnGetShareUrlResultListener(
new OnGetShareUrlResultListener() {
@Override
public void onGetPoiDetailShareUrlResult(final ShareUrlResult shareUrlResult){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
""+shareUrlResult.getUrl(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onGetLocationShareUrlResult(ShareUrlResult shareUrlResult) {
}
@Override
public void onGetRouteShareUrlResult(ShareUrlResult shareUrlResult) {
}
});
}
//=============poi检索监听==============
private void initPoiListener() {
poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
//获取POI检索结果
@Override
public void onGetPoiResult(PoiResult poiResult) {
//判断是否有结果
if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
Log.v("TAG", "没有找到相关搜索");
return;
}
//获取检索结果集
List<PoiInfo> list = poiResult.getAllPoi();
for (PoiInfo info : list) {
Log.i("TAG", "onGetPoiResult: " + info.name);
//添加标注物
/* BitmapDescriptor bitmapDescriptor
= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
OverlayOptions options = new MarkerOptions().position(info.location)
.icon(bitmapDescriptor);
mapView.addOverlay(options);*/

                //添加系统提供的标注物
                mapView.clear();
                MyOverly myOverly = new MyOverly(mapView);
                myOverly.setData(poiResult);
                myOverly.addToMap();
                myOverly.zoomToSpan(); //自动放大
                mapView.setOnMarkerClickListener(myOverly);
            }
        }
        //poi搜索的回调详情  点击的时候调用此方法
        @Override
        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

//=======分享的第一个回调poi(PoiInfo)==》request(shareUrl)=====
shareUrlSearch.requestPoiDetailShareUrl(
new PoiDetailShareURLOption()
.poiUid(poiDetailResult.getUid()));

            /*shareUrlSearch.requestLocationShareUrl(
                    new LocationShareURLOption()
                            .location(poiDetailResult.getLocation())
                            .name("aaa").snippet("bbb"));*/
        }
        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
        }
    });
}
class MyOverly extends PoiOverlay {
    /**
     * 构造函数
     *
     * @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
     */
    public MyOverly(BaiduMap baiduMap) {
        super(baiduMap);
    }

    @Override
    public boolean onPoiClick(int i) {
        List<PoiInfo> allPoi = getPoiResult().getAllPoi();
        Toast.makeText(MainActivity.this,
                "" + allPoi.get(i).name, Toast.LENGTH_SHORT).show();
        //
        poiSearch.searchPoiDetail(
                    new PoiDetailSearchOption().poiUid(allPoi.get(i).uid));
        return super.onPoiClick(i);
    }
}

private void initMarkerListener() {
    mapView.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            Toast.makeText(MainActivity.this, "别点我讨厌!!", Toast.LENGTH_SHORT).show();
            return false;
        }
    });
}

private void initMapListener() {
    //设置地图点击事件
    mapView.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latLng) {//坐标
            mapView.clear();//清除地图上的所有的覆盖物
            //创建一个覆盖物的图标
            BitmapDescriptor icon = BitmapDescriptorFactory
                    .fromResource(R.mipmap.ic_launcher);
            //创建一个覆盖物
            OverlayOptions options =
                    new MarkerOptions().position(latLng).icon(icon);
            //将覆盖物添加到地图中
            mapView.addOverlay(options);
        }

        @Override
        public boolean onMapPoiClick(MapPoi mapPoi) {
            return false;
        }
    });
}
private void initView() {
    map = (MapView) findViewById(R.id.mapview);
    //获取当前的地图
    mapView = map.getMap();

    //初始化POI检索
    poiSearch = PoiSearch.newInstance();
    //初始化分享
    shareUrlSearch = ShareUrlSearch.newInstance();
    //创建线路规划的实例
    routePlanSearch = RoutePlanSearch.newInstance();
    //地理编码
    //地理编码
    geoCoder = GeoCoder.newInstance();
}
/*
*
* 添加图层
*
* */
public void btn1(View view) {
    //添加交通图
    mapView.setTrafficEnabled(true);
    //mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
   /* //普通地图
    mapView.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    //卫星地图
    mapView.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
    //空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,将不会使用流量下载基础地图瓦片图层。

// 使用场景:与瓦片图层一起使用,节省流量,提升自定义瓦片图下载速度。
mapView.setMapType(BaiduMap.MAP_TYPE_NONE);
//开启交通图 实时交通图
mapView.setTrafficEnabled(true);
//开启交通图 百度城市热力图
mapView.setBaiduHeatMapEnabled(true);*/
}

/*
* 添加覆盖物
*
* */
public void btn2(View view) {
    //添加Marker
   /* //经纬度
    LatLng l = new LatLng(39.963175,116.400244);

    //创建一个覆盖物的图标
    BitmapDescriptor icon = BitmapDescriptorFactory
            .fromResource(R.mipmap.ic_launcher);

    //创建一个覆盖物
    OverlayOptions options = new MarkerOptions().position(l).icon(icon);

    //将覆盖物添加到地图中
    mapView.addOverlay(options);*/

    //添加几何图形
    //添加一个几何图形
    LatLng l1 = new LatLng(39.93925, 116.357428);

    LatLng l2 = new LatLng(39.90925, 116.327428);

    LatLng l3 = new LatLng(39.88925, 116.347428);

    //将三个坐标添加到集合中
    List<LatLng> pt = new ArrayList<>();
    pt.add(l1);
    pt.add(l2);
    pt.add(l3);

    OverlayOptions options = new PolygonOptions().points(pt)
            //2 边宽  和边的颜色  , fillColor(填充的颜色)
            .stroke(new Stroke(2, 0xAA00FF00)).fillColor(0xAA00FF00);

    mapView.addOverlay(options);
}


/*
* POI检索
*
* */
public void btn3(View view) {

    //城市内检索
    /*
        PoiCitySearchOption city(java.lang.String city)
        检索城市
        PoiCitySearchOption keyword(java.lang.String key)
        搜索关键字
        PoiCitySearchOption pageCapacity(int pageCapacity)
        设置每页容量,默认为每页10条
        PoiCitySearchOption pageNum(int pageNum)
        分页编号
     */

    /*poiSearch.searchInCity(
            new PoiCitySearchOption().city("北京")
                    .keyword("ATM").pageNum(1).pageCapacity(10));*/

    /**
     keyword(java.lang.String key)
     检索关键字
     PoiNearbySearchOption  location(LatLng location)
     检索位置
     PoiNearbySearchOption  pageCapacity(int pageCapacity)
     设置每页容量,默认为每页10条
     PoiNearbySearchOption  pageNum(int pageNum)
     分页编号
     PoiNearbySearchOption  radius(int radius)
     设置检索的半径范围
     PoiNearbySearchOption  sortType(PoiSortType sortType)
     搜索结果排序规则,可选,默认
     */

    //周边检索,有一个中心点
    LatLng l1 = new LatLng(39.93925, 116.357428);
    poiSearch.searchNearby(new PoiNearbySearchOption()
            .radius(10000).pageCapacity(10).pageNum(1).location(l1).keyword("美食"));
}


/*
* 路线规划
* */
public void btn4(View view){
    //路线  第一个参数是cityCode
               第二个是具体地址
    PlanNode stNode = PlanNode.withCityCodeAndPlaceName(132, "xxxx");
    PlanNode endNode = PlanNode.withCityCodeAndPlaceName(132, "xxxx");

// routePlanSearch.transitSearch(new TransitRoutePlanOption()
// .city("北京").from(stNode).to(endNode));
routePlanSearch.drivingSearch(new DrivingRoutePlanOption()
.from(stNode).to(endNode));
// routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(stNode).to(endNode));
}

/*
* 地理编码
* */
public void btn5(View view){
    //将经纬度转找成地址
    geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
            .location(new LatLng(39.946758,116.423134)));

    //将地址转换成经纬度

// geoCoder.geocode(new GeoCodeOption()
// .address("北京").city("北京"));
}

public void btn6(View view){
    onCreate();
}

public void btn7(View view){
    //开启定位图层
    mapView.setMyLocationEnabled(true);

}


public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();

public void onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());
    //声明LocationClient类
    mLocationClient.registerLocationListener( myListener );
    //注册监听函数
    initLocation();
    mLocationClient.start(); //开启定位
}

/*
* 设置locationClient的参数
*
* */
private void initLocation(){
    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
    //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
    option.setCoorType("bd09ll");
    //可选,默认gcj02,设置返回的定位结果坐标系
    int span=1000;
    option.setScanSpan(span);
    //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    option.setIsNeedAddress(true);
    //可选,设置是否需要地址信息,默认不需要
    option.setOpenGps(true);
    //可选,默认false,设置是否使用gps
    option.setLocationNotify(true);
    //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
    option.setIsNeedLocationDescribe(true);
    //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
    option.setIsNeedLocationPoiList(true);
    //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    option.setIgnoreKillProcess(false);
    //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
    option.SetIgnoreCacheException(false);
    //可选,默认false,设置是否收集CRASH信息,默认收集
    option.setEnableSimulateGps(false);
    //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
    mLocationClient.setLocOption(option);
}

/*
* 获取定位的信息
* */
private boolean isFirst = true;
public class MyLocationListener implements BDLocationListener {

    @Override
    public void onReceiveLocation(BDLocation location) {
        //获取定位结果
       /* StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());    //获取定位时间
        sb.append(location.getAddrStr());
        String s = sb.toString();
        Log.i("BaiduLocationApiDem", sb.toString());*/

        // 构造定位数据
        MyLocationData locData = new MyLocationData.Builder()
                //设置精确度
                .accuracy(location.getRadius())
                // 此处设置开发者获取到的方向信息,顺时针0-360
                .direction(100)
                //设置纬度
                .latitude(location.getLatitude())
                //设置经度
                .longitude(location.getLongitude())
                .build();
        // 设置定位数据
        mapView.setMyLocationData(locData);

        if (isFirst){
            isFirst = false; //只会在第一次更新的时候才更新
            LatLng lat = new LatLng(location.getLatitude(),
                    location.getLongitude());
            //第一个参数是坐标,第二个参数是缩放值
            MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(lat,13);
            mapView.animateMapStatus(mapStatusUpdate);
        }
    }
}



@Override
protected void onDestroy() {
    super.onDestroy();
    map.onDestroy();
    poiSearch.destroy();
}

@Override
protected void onPause() {
    super.onPause();
    map.onPause();
}

@Override
protected void onResume() {
    super.onStop();
    map.onResume();
}

}
开发中坑:
《坑一》安全码校验 MCodeCheck.apk,解决地图不出现的原因
安全码校验是真实运行的SAH1,需要把创建应用的SAH1覆盖,地图就会显示
注册配置的SHA1和运行的应用的SAH1必须保持一致,地图才会出现
《坑二》参考:http://blog.csdn.net/taoolee/article/details/49361569
java.lang.IllegalArgumentException: No config chosen
异常的原因是SDK找不到支持OPENGL的硬件.从论坛得知,用户钩选了Use Host Gup 选项,此选项是说模拟器使用用户物理机上的GPU。如果用户物理机没有独立显卡,就会报错,此种情况下不钩这个选项就可以了。模拟器设置问题,与sdk没关系.

直白点就是模拟器不行: 需要真机测试
《坑三》6.0 动态申请定位权限

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容