文档章节

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

Cosven
 Cosven
发布于 2014/01/30 15:51
字数 1664
阅读 395
收藏 15

首先,我必须说,我是菜鸟。接触Android不就久,在这里记下,第一想让自己有更加深刻的印象,第二也想和大家一起分享。如果出现一些错误,还请批评和指正。表情

先叙述一下一个小故事。(话说码农都需要训练自己的表达能力)表情

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

这个小应用和上面这个事情也是可以扯上那么一点关系的。


##使用简介:

  • 安装此软件的用户可以通过start按钮获取自己位置

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

##使用注意:

  • 需要在有数据连接的情况下才能获得具体位置,否则只能获得经纬度

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

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

  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>

个人博客地址

© 著作权归作者所有

共有 人打赏支持
Cosven

Cosven

粉丝 36
博文 46
码字总数 27482
作品 2
杭州
程序员
私信 提问
加载中

评论(4)

Cosven
Cosven

引用来自“哈哈习习”的评论

大神你好,你的定位使用百度地图API那步尝试很久,setak那步一直有错,求教学啊!!

出什么错?
是key不对?那个key要自己去申请的。要把key换成你自己的。申请key的教程,你可以上百度地图定位API那个网上去看。不晓得你是不是这些问题。
我也是学习用,,所以有些错误不一定能帮你解决
哈哈习习
大神你好,你的定位使用百度地图API那步尝试很久,setak那步一直有错,求教学啊!!
Cosven
Cosven

引用来自“包灬子”的评论

如果.....安装了360等等呢

在360里面允许发送短信的权限应该还是可以的。不然就只能4...你懂得
包灬子
包灬子
如果.....安装了360等等呢
Android 4.1.2 系统更新内容详解

本周谷歌刚刚发布了最新版本的Android 4.1.2系统,我们也在第一时间上手试用并为大家带来了这篇介绍文章。如果你想要知道4.1.2中的新变化那你来对地方了。说实话其实可供介绍的方面并 不多,...

qixinghaitang
2012/10/16
11.8K
13
Android SpyDealer 木马能窃取超过 40 款应用数据

Palo Alto Networks的安全专家发现一款新的Android木马,取名为SpyDealer,它能够窃取多达40款应用的数据,包括相当一部分微信、QQ、新浪微博、易信、飞信等用户群为中国人的应用,因此针对的...

两味真火
2017/07/11
812
3
“子弹短信也压根撼动不了腾讯”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csdnnews/article/details/82631747 无论是锤子手机的微创新还是子弹短信的微创新,老罗在微创新的同一个坑里...

CSDN资讯
2018/09/11
0
0
“子弹短信也压根撼动不了腾讯” | 畅言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csdnnews/article/details/82634866 作者 | 徐星 责编 | 郭芮 老罗发布子弹短信,我是有点激动的。我厌倦了朋...

CSDN资讯
2018/09/11
0
0
Android辅助类病毒研究报告

  前言   近期,腾讯反诈骗实验通过AI引擎聚类关联发现,恶意利用Android辅助功能,究其原因是,从市场反馈来看,由于没有足够的安全意识,导致辅助功能被恶意使用,及诱导用户开启辅助功...

FreeBuf
2018/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

腾讯面试:一条SQL语句执行得很慢的原因有哪些?

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实...

java菜分享
29分钟前
8
0
Java 基本功 之 CAS

本文首发于个人公众号《andyqian》, 期待你的关注! 前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机...

andyqian
32分钟前
4
0
信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互...

shzwork
43分钟前
1
0
在VirtualBox 6.0中安装fedora 30

操作系统安装完毕后首先进行更新。 sudo dnf update 重启虚拟机后,安装VirtualBox依赖的软件包。 sudo dnf install kernel-headers kernel-devel dkms gcc 最后,安装“增强功能”。...

gugudu
52分钟前
1
0
861. Score After Flipping Matrix

为了获得最大值,我们必须保证每一行列下标小的1尽可能的多(最高位的1尽可能多)。 首先,考虑我们可以进行的操作有 翻转列,进行列操作 翻转行,进行行操作 通过行操作 我们总是可以使得第...

reter
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部