as作业

(一)Android的三种定位方式与定位模式模块

(1)界面布局activity_main.xml代码:包含一个id为tv的TextView控件,用于显示定位结果(经纬度)

(2)配置权限:

<!-- 2个定位权限是危险权限并处于一个权限组,需要动态申请 -->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--精确定位-->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--粗糙定位-->

<!-- 网络权限和WiFi权限是普通权限,不需要动态申请 -->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--网络状态-->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!--WiFi状态-->

(3)界面程序MainActivity.java架构及代码如下:

/*

    Android提供了三种定位方式(GPS定位、WiFI定位和基站定位)获得定位信息—经纬度【基站定位也称移动网络定位,也称为GPRS定位】

    打开位置服务时,必须从三种定位模式(高精度—混合定位、节电—网络定位和单独的GPS定位)中选择一种,通常选择混合定位

    GPS定位精度高,但可能由于GPS信号弱而较慢甚至获取不到

    GPS定位对应于权限android.permission.ACCESS_FINE_LOCATION

    网络定位(WiFi或移动网络)定位速度快,但精度相对GPS低

    网络定位对应于权限android.permission.ACCESS_COARSE_LOCATION【COARSE系粗糙之意】

*/

public class MainActivity extends AppCompatActivity {

    LocationManager lm;  //位置服务管理器

    ConnectivityManager cm;  //网络连接管理器

    WifiManager wfm;  //Wifi管理器

    TextView tv;  //显示经纬度

    final static int LOCATION_SETTING_REQUEST_CODE = 100;

    final static int NETWORK_SETTING_REQUEST_CODE = 200;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //如果没有ACCESS_COARSE_LOCATION权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);

        }else {

            prepareLocatingService();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {

            case 1:

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  //危险权限

                    prepareLocatingService();

                } else {

                    Toast.makeText(this, "没有授予定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                }

        }

    }

    //定位服务预备

    void prepareLocatingService() {

        tv = findViewById(R.id.tv);

        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        //android API 24之后,必须使用 getApplicationContext()

        wfm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        //打开定位服务时(有多种检测方法)

        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER) || lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

            //打开位置服务作为定位的入口

            locatingService();  //方法调用

        } else {

            new AlertDialog.Builder(this)

                    .setIcon(R.mipmap.ic_launcher)

                    .setTitle("消息框")

                    .setMessage("请先打开定位服务!")

                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override

                        public void onClick(DialogInterface dialog, int which) {

                            //定位服务设置意图

                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

                            //有返回值的调用,设置定位设置请求码

                            startActivityForResult(intent, LOCATION_SETTING_REQUEST_CODE);

                        }

                    })

                    .show();

            Log.i("wustwzxabc", "test1111");  //未阻塞,即用户单击“确定”按钮前此信息已经输出

            //即Android里的AlertDialog,是非阻塞的!

        }

    }

    void locatingService() {  //已开启位置服务时

        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER) && lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

            //使用混合定位(GPS+网络)

            if (cm.getActiveNetworkInfo() != null) {

                networkLocation();  //为了尽快获取定位数据,假定网络定位优先

            } else {

                GPSLocation();  //使用GPS定位

            }

        } else {

            if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  //使用单GPS定位方式

                GPSLocation();

            } else {

                if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {  //未开启GPS定位—即网络定位—节电模式

                    networkLocation();

                }

            }

        }

    }

    void GPSLocation() {

        tv.setText("GPS定位中...");

        Toast.makeText(getApplicationContext(), "GPS定位", Toast.LENGTH_LONG).show();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;

        }

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, new LocationListener() {

            @Override

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderEnabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderDisabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onLocationChanged(Location location) {

                // TODO Auto-generated method stub

                String string1 = "纬度为:" + location.getLatitude() + "\n经度为:" + location.getLongitude();

                tv.setText(string1);

            }

        });

    }

    void networkLocation() {

        if (cm.getActiveNetworkInfo() != null) { //有网络连接时

            if (wfm.isWifiEnabled()) { //WIFI有效时

                Toast.makeText(getApplicationContext(), "WiFi方式的网络定位", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(getApplicationContext(), "基站方式的网络定位", Toast.LENGTH_LONG).show();

            }

        } else { //没有网络连接时

            new AlertDialog.Builder(this)

                    .setIcon(R.mipmap.ic_launcher)

                    .setTitle("消息框")

                    .setMessage("无网络连接!请先设置一种网络连接...")

                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override

                        public void onClick(DialogInterface dialog, int which) {

                            //进入网络连接设置

                            Intent intent = new Intent(Settings.ACTION_SETTINGS);

                            //有返回值的调用,设置网络设置请求码

                            startActivityForResult(intent, NETWORK_SETTING_REQUEST_CODE);

                        }

                    })

                    .show();

        }

        //下面的请求位置(实时)更新,Android 6.0及以上版本需要在首次运行时动态加载上述权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;

        }

        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, new LocationListener() {  //实时监听

            @Override

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderEnabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onProviderDisabled(String arg0) {

                // TODO Auto-generated method stub

            }

            @Override

            public void onLocationChanged(Location location) {

                // TODO Auto-generated method stub

                String string2 = "纬度为:" + location.getLatitude() + "\n经度为:" + location.getLongitude();

                //Toast.makeText(getApplicationContext(), string2, Toast.LENGTH_LONG).show();

                tv.setText(string2);

            }

        });

    }

    @Override  //有返回值的调用

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        //只用到了请求码

        if (requestCode == LOCATION_SETTING_REQUEST_CODE || requestCode == NETWORK_SETTING_REQUEST_CODE) {

            prepareLocatingService();

        }

    }

}

【Return Top】

(二)百度定位包的使用模块:example10_2

运行效果

预备:访问http://lbsyun.baidu.com,依次选择:开发文档->Android 地图SDK->产品下载->自定义下载,勾选百度定位包后下载、解压

在项目里,新建名为example10_2的模块

选择模块视图为Project,复制定位包BaiduLBS_Android.jar至模块example10 _2的libs文件夹里,然后右键jar文件,选择“Add As Library”

在main文件夹下新建名为jniLibs的文件夹,复制存放.so文件(share object)的多个文件夹至jniLibs文件夹

在模块的清单文件里,增加如下权限:

<!--百度定位所需要权限,前面2个是LOCATE权限组的2个危险权限-->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!--百度定位所需要的普通权限-->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

<uses-permission android:name="android.permission.INTERNET"/> <!--因为程序要与百度云服务交互-->

获取本机的Android指纹码——SHA(Secure Hash Algorithm,安全散列算法),其方法如下:

访问该网址 进入百度地图开发者页面、注册和登录(注册含于登录界面里)

使用百度帐号成功登录后,进入控制台,创建应用

提交后,生成应用的AK,查看应用Key并复制,以供清单文件配置应用Key用。

在清单文件里,在Activity组件注册的代码后,添加注册远程服务和配置应用Key的代码:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

<meta-data

    android:name="com.baidu.lbsapi.API_KEY"

    android:value="NDnYRd8LK85vGbLeRVaV23x9RccY5M3p"/><!--应用Key是在百度开发者页面里生成的,需要替换-->

布局activitymain.xml代码:添加一个id为tvpositionText的TextView控件

界面程序MainActivity.java代码如下:

/*

    百度定位信息,使用一个TextView控件显示

    一般需要打开定位服务,选择高精度定位模式,有网络连接

    需要在清单文件里使用百度云服务(参见清单文件service标签)

    需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签)

*/

public class MainActivity extends AppCompatActivity {

    public LocationClient mLocationClient; //定位客户端

    TextView tv_positionText;  //显示定位信息控件

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //如果没有定位权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

        }else {

            requestLocation();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                } else {

                    requestLocation();

                }

        }

    }

    private void requestLocation() {

        initLocation();  //初始化

        mLocationClient.start();  //开始定位

    }

    @Override

    protected void onDestroy() {

        super.onDestroy(); 

        mLocationClient.stop();

    }

    private void initLocation() { 

        setContentView(R.layout.activity_main);

        mLocationClient = new LocationClient(getApplicationContext());

        mLocationClient.registerLocationListener(new MyLocationListener());

        tv_positionText = findViewById(R.id.tv_positionText);

        //定位客户端操作

        LocationClientOption option = new LocationClientOption();

        //设置扫描时间间隔(单位:毫秒)

        option.setScanSpan(1000);

        //设置定位模式,三选一

        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

        /*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);

        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/

        //设置需要地址信息

        option.setIsNeedAddress(true);

        //保存定位参数

        mLocationClient.setLocOption(option);

    }

    class MyLocationListener implements BDLocationListener {

        @Override

        public void onReceiveLocation(BDLocation bdLocation) {

            StringBuffer currentPosition = new StringBuffer();

            currentPosition.append("Longitude:").append(bdLocation.getLongitude()).append("\n");

            currentPosition.append("Latitude:").append(bdLocation.getLatitude()).append("\n");

            currentPosition.append("Country:").append(bdLocation.getCountry()).append("\n");

            currentPosition.append("Province:").append(bdLocation.getProvince()).append("\n");

            currentPosition.append("City:").append(bdLocation.getCity()).append("\n");

            currentPosition.append("District:").append(bdLocation.getDistrict()).append("\n");

            currentPosition.append("Street:").append(bdLocation.getStreet()).append("\n");

            currentPosition.append("Address:").append(bdLocation.getAddrStr());

            tv_positionText.setText(currentPosition);

        }

    }

}

【Return Top】

(三)百度地图包的使用模块:example10_3

运行效果

在项目里,新建名为example10_3的模块,并切换至Project视图

访问http://lbsyun.baidu.com,依次选择:开发文档->Android开发->Android地图SDK->产品下载,勾选百度定位包和百度地图后下载、解压,按照上一模块的做法,复制.jar文件到libs文件夹,新建jniLibs文件夹并复制包含.so文件的几个文件夹(需要进入jniLibs文件夹,使用Windows文件资源管理器复制,其容量应为18M左右!)

生成本应用的Key。

在清单文件里,在Activity组件注册的代码后,添加注册远程服务和配置应用Key的代码:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

<meta-data

    android:name="com.baidu.lbsapi.API_KEY"

    android:value="AXHLWlI2UtWhLk2YMGaLSdzva3WfhOyK"/><!--应用Key是在百度开发者页面里生成的,需要替换-->

界面布局使用帧布局,包含有重叠效果的地图和位置文本,activity_main.xml的完整代码如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <!--百度地图控件-->

    <com.baidu.mapapi.map.MapView

        android:id="@+id/bmapView"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:clickable="true" />

    <!--位置文本布局的背景色代码的前2位代码为透明度-->

    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:background="#e0000000"

        android:orientation="vertical" >

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="20dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="纬度:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Lat"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="10dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="经度:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Lon"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginBottom="10dp"

            android:layout_marginLeft="12dp"

            android:layout_marginTop="10dp"

            android:orientation="horizontal" >

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="地址:"

                android:textColor="#ffffff"

                android:textSize="15dp" />

            <TextView

                android:id="@+id/tv_Add"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text=""

                android:textColor="#ffffff"

                android:textSize="15dp" />

        </LinearLayout>

    </LinearLayout>

</FrameLayout>

界面程序MainActivity.java代码如下:

/*

    百度地图应用,包含定位信息和地图显示

    一般需要打开定位服务,选择高精度定位模式,有网络连接

    需要在清单文件里使用百度云服务(参见清单文件service标签)

    需要创建应用(模块)的Key,并写入清单文件(参见清单文件meta标签)

*/

public class MainActivity extends AppCompatActivity {

    LocationClient mLocationClient;  //定位客户端

    MapView mapView;  //Android Widget地图控件

    BaiduMap baiduMap;

    boolean isFirstLocate = true;

    TextView tv_Lat;  //纬度

    TextView tv_Lon;  //经度

    TextView tv_Add;  //地址

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //如果没有定位权限,动态请求用户允许使用该权限

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

        }else {

            requestLocation();

        }

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(this, "没有定位权限!", Toast.LENGTH_LONG).show();

                    finish();

                } else {

                    requestLocation();

                }

        }

    }

    private void requestLocation() {

        initLocation();

        mLocationClient.start();

    }

    private void initLocation() {  //初始化

        mLocationClient = new LocationClient(getApplicationContext());

        mLocationClient.registerLocationListener(new MyLocationListener());

        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        mapView = findViewById(R.id.bmapView);

        baiduMap = mapView.getMap();

        tv_Lat = findViewById(R.id.tv_Lat);

        tv_Lon = findViewById(R.id.tv_Lon);

        tv_Add = findViewById(R.id.tv_Add);

        LocationClientOption option = new LocationClientOption();

        //设置扫描时间间隔

        option.setScanSpan(1000);

        //设置定位模式,三选一

        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

        /*option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);

        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);*/

        //设置需要地址信息

        option.setIsNeedAddress(true);

        //保存定位参数

        mLocationClient.setLocOption(option);

    }

    //内部类,百度位置监听器

    private class MyLocationListener  implements BDLocationListener {

        @Override

        public void onReceiveLocation(BDLocation bdLocation) {

            tv_Lat.setText(bdLocation.getLatitude()+"");

            tv_Lon.setText(bdLocation.getLongitude()+"");

            tv_Add.setText(bdLocation.getAddrStr());

            if(bdLocation.getLocType()==BDLocation.TypeGpsLocation || bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){

                navigateTo(bdLocation);

            }

        }

    }

    private void navigateTo(BDLocation bdLocation) {

        if(isFirstLocate){

            LatLng ll = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());

            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);

            baiduMap.animateMapStatus(update);

            isFirstLocate = false;

        }

    }

    @Override

    protected void onResume() {

        super.onResume();

        mapView.onResume();

    }

    @Override

    protected void onPause() {

        super.onPause();

        mapView.onResume();

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        mLocationClient.stop();

        mapView.onDestroy();

    }

}

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