首先,我必须说,我是菜鸟。接触Android不就久,在这里记下,第一想让本身有更加深入的印象,第二也想和你们一块儿分享。若是出现一些错误,还请批评和指正。java
先叙述一下一个小故事。(话说码农都须要训练本身的表达能力)。android
one day,朋友说好明天一块儿去**地方去玩,可是到了次日,lz 等啊等,上午的时候,lz 想,睡睡懒觉也是很正常的,到了中午差很少一点钟了,lz 有点急了,要出去玩也该行动了,因此lz 决定call朋友问状况,结果电话一直没人接,发短信什么的也没人回... 而后从脑壳里面立刻蹦出来的想法是,朋友出事了(如今回想以为本身确定有某种 神经类的病...)。时候到了晚上的时候,这位朋友qq上说,她手机摔水里了,没带。(情节大概这样,细节可能有误,不过这些都不是关键,下面开始今天的学习笔记
)git
这个小应用和上面这个事情也是能够扯上那么一点关系的。网络
##使用简介:app
安装此软件的用户能够经过start按钮获取本身位置ide
任何其余人经过发送短信location到安装了此软件的手机上,这手机就会自动经过短信回复它当前的位置。学习
##使用注意:测试
须要在有数据链接的状况下才能得到具体位置,不然只能得到经纬度this
部分机型和系统不适用(多是权限问题)。(其中多部小米手机测试失败,其余都OK)google
###大概实现思路###
这些类的实现是东拼西凑出来的 这里就再也不多讲,代码都有比较详细的注释
下面是code:
短信监视
<!-- lang: java --> // file : Receiver.java package com.example.location; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.widget.Toast; public class Receiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { SmsMessage msg = null; Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdusObj = (Object[]) bundle.get("pdus"); for (Object p : pdusObj) { msg= SmsMessage.createFromPdu((byte[]) p); String msgTxt =msg.getMessageBody();//获得消息的内容 String senderNumber = msg.getOriginatingAddress();// 获得发信人的号码,用于以后的回复 // 若是短信内容为location,这里的判断条件,能够随便设定,也能够是 判断电话号码 if(msgTxt.equals("location")) // string1.equal(string2):用来判断两个字符创是否同样。不能用 == 来判断 { Toast.makeText(context, "来自"+senderNumber+"的定位请求", Toast.LENGTH_LONG).show();//Toast 是一个很好的和用户交互的一个东西 Data.setNum(senderNumber);// 把电话号码记录下来,让它变为全局的一个变量 Intent i = new Intent(context, Main.class);// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //在 broadcastreceiver 和activity 的通讯中,须要这句 context.startActivity(i);//启动主程序 } } } return; } }
定位(这里使用了百度地图定位API V4.0, 这里的主要代码也是用了它给的demo,因此这里用到了“依赖库”须要从本身下载并添加到工程,能够google或百度一下教程)
LocationDemoActivity.java:
<!-- lang: java --> package com.example.location; import android.annotation.SuppressLint; import android.app.Application; import android.os.Vibrator; import android.telephony.SmsManager; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.BDNotifyListener; import com.baidu.location.LocationClient; @SuppressLint("ShowToast") public class LocationDemoActivity extends Application{ public LocationClient mLocationClient = null; private String mData; public MyLocationListener myListener = new MyLocationListener(); public TextView mTv; public NotifyListener mNotifyer = null; public Vibrator mVibrator01; public static String TAG = "LocTest"; public void onCreate(){ mLocationClient = new LocationClient( this); mLocationClient.setAK("Sh4785hU7rESaywsFGAQUHio"); // 这个key须要本身去申请(百度地图定位API) mLocationClient.registerLocationListener(myListener); super.onCreate(); } public void logMsg(String str){ SmsManager smsManager = SmsManager.getDefault(); try{ mData = str; // if( mTv != null){ // 判判定位是否成功 mTv.setText(mData); if(Data.getNum().equals("0")){ // 判断是用户本身在使用定位,仍是别人发短信 Toast.makeText(getApplicationContext(), "定位结束", Toast.LENGTH_SHORT).show(); } else{ smsManager.sendTextMessage(Data.getNum(),null,mData+"定位成功",null,null); Toast.makeText(getApplicationContext(), "正在回复短信。。。", Toast.LENGTH_LONG).show(); android.os.Process.killProcess(android.os.Process.myPid()); //在定位以后自动关闭程序。 } } else{ Toast.makeText(this, "fail", Toast.LENGTH_LONG ).show(); } } catch(Exception e){ e.printStackTrace(); } } public class MyLocationListener implements BDLocationListener{ // 这里打code几乎都是那个demo上面的,详细解释能够参考百度地图定位API的开发指南 @Override public void onReceiveLocation(BDLocation location){ if(location == null) return ; StringBuffer sb = new StringBuffer(256); Toast.makeText(getApplicationContext(), "获取经纬度中...", Toast.LENGTH_LONG).show(); sb.append("纬度"+location.getLatitude()+"\n"); sb.append("经度"+location.getLongitude()+"\n"); Toast.makeText(getApplicationContext(), "尝试获取详细地址...", Toast.LENGTH_LONG).show(); if (location.getLocType()==BDLocation.TypeGpsLocation){ sb.append("速度"+location.getSpeed()+"\n"); sb.append("卫星个数"+location.getSatelliteNumber()+"\n"); Toast.makeText(getApplicationContext(), "当前定位模式:GPS定位", Toast.LENGTH_SHORT).show(); } else if(location.getLocType() == BDLocation.TypeNetWorkLocation){ //sb.append("省份:"+location.getProvince()+"\n"); //sb.append("市:"+location.getCity()+"\n"); //sb.append("县:"+location.getDistrict()+"\n"); Toast.makeText(getApplicationContext(), "当前定位模式:网络定位", Toast.LENGTH_SHORT).show(); sb.append("地址:"+location.getAddrStr()+"\n"); } logMsg(sb.toString()); System.out.println(sb); } @Override public void onReceivePoi(BDLocation poiLocation) { if(poiLocation == null) { return ; } Toast.makeText(getApplicationContext(), "尝试得到周围兴趣点...", Toast.LENGTH_LONG).show(); Toast.makeText(getApplicationContext(), "getPoi", Toast.LENGTH_LONG).show(); StringBuffer sb = new StringBuffer(256); sb.append("具体地址: "); if(poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append(poiLocation.getAddrStr()); } if(poiLocation.hasPoi()){ sb.append("Poi:"); sb.append(poiLocation.getPoi()); } else{ sb.append("noPoi"); } logMsg(sb.toString()); } } public class NotifyListener extends BDNotifyListener{ public void onNotify(BDLocation mlocation, float distance){ mVibrator01.vibrate(1000); } } }
数据类
<!-- lang: java --> // Data.java package com.example.location; public class Data { public static String num = "0"; public static String getNum(){ return num; } public static void setNum(String s){ Data.num = s; } }
主程序
<!-- lang: java --> package com.example.location; import android.app.Activity; import android.app.Service; import android.os.Bundle; import android.os.Vibrator; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; public class Main extends Activity { private TextView mTv = null; private Button mStartBtn; private boolean mIsStart; private Vibrator mVibrator01 = null; private LocationClient mLocClient; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); mTv = (TextView)findViewById(R.id.tv); mStartBtn = (Button)findViewById(R.id.btn_start); mIsStart = false; mLocClient = ((LocationDemoActivity)getApplication()).mLocationClient; ((LocationDemoActivity)getApplication()).mTv = mTv; mVibrator01 = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE); ((LocationDemoActivity)getApplication()).mVibrator01 = mVibrator01; if(! Data.getNum().equals("0") ) { if(!mIsStart){ setLocationOption(); mLocClient.start(); mStartBtn.setText("stop"); mIsStart = true; } else{ mLocClient.stop(); mIsStart = false; mStartBtn.setText("start"); } } mStartBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ if(!mIsStart){ setLocationOption(); mLocClient.start(); mStartBtn.setText("stop"); mIsStart = true; } else{ mLocClient.stop(); mIsStart = false; mStartBtn.setText("start"); } } }); } public void onDestroy(){ mLocClient.stop(); ((LocationDemoActivity)getApplication()).mTv = null; super.onDestroy(); } public void setLocationOption(){ LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setServiceName("con,baidu.location.service_v2.9"); option.setAddrType("all"); option.setPriority(LocationClientOption.GpsFirst); option.setPoiNumber(10); option.disableCache(true); mLocClient.setLocOption(option); } }
main.xml
<!-- lang: xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn_start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="Start"/> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout>
AndroidMainfest.xml
<!-- lang: xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.location" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </permission> <uses-permission android:name="android.permission.SEND_SMS" ></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS" ></uses-permission> <uses-permission android:name="android.permission.READ_SMS"></uses-permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" > </uses-permission> <uses-permission android:name="android.permission.READ_LOGS" > </uses-permission> <application android:name="com.example.location.LocationDemoActivity" android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=".Main" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".Receiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <service android:name="com.baidu.location.f" android:enabled="true" android:permission="android.permission.BAIDU_LOCATION_SERVICE" android:process=":remote" > </service> </application>
</manifest>