Android学习笔记:短信控制手机之“短信开启定位”

首先,我必须说,我是菜鸟。接触Android不就久,在这里记下,第一想让本身有更加深入的印象,第二也想和你们一块儿分享。若是出现一些错误,还请批评和指正。表情java

先叙述一下一个小故事。(话说码农都须要训练本身的表达能力)表情android

one day,朋友说好明天一块儿去**地方去玩,可是到了次日,lz 等啊等,上午的时候,lz 想,睡睡懒觉也是很正常的,到了中午差很少一点钟了,lz 有点急了,要出去玩也该行动了,因此lz 决定call朋友问状况,结果电话一直没人接,发短信什么的也没人回... 而后从脑壳里面立刻蹦出来的想法是,朋友出事了(如今回想以为本身确定有某种 神经类的病...表情)。时候到了晚上的时候,这位朋友qq上说,她手机摔水里了,没带。(情节大概这样,细节可能有误,不过这些都不是关键,下面开始今天的学习笔记在此输入图片描述git

这个小应用和上面这个事情也是能够扯上那么一点关系的。网络


##使用简介:app

  • 安装此软件的用户能够经过start按钮获取本身位置ide

  • 任何其余人经过发送短信location到安装了此软件的手机上,这手机就会自动经过短信回复它当前的位置。学习

##使用注意:测试

  • 须要在有数据链接的状况下才能得到具体位置,不然只能得到经纬度this

  • 部分机型和系统不适用(多是权限问题)。(其中多部小米手机测试失败,其余都OK)google

###大概实现思路###

  1. 写了一个短信监视类: Receiver
  2. 一个实现定位的类 : LocatonDemoActivity
  3. 一个储存全局变量的类 : Data

这些类的实现是东拼西凑出来的 这里就再也不多讲,代码都有比较详细的注释

下面是code:

  1. 短信监视

    <!-- 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;
         }
     }
  2. 定位(这里使用了百度地图定位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);
    		}
    	}
    }
  1. 数据类

    <!-- 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;
    	}
    }
  2. 主程序

    <!-- 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);
         	}
         }
  3. 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>
  4. 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>

我的博客地址

相关文章
相关标签/搜索