基于百度定位SDK的定位服务的实现

来源:互联网 发布:游戏服务端 python 编辑:程序博客网 时间:2024/06/11 19:36

转载:http://blog.csdn.net/android_ls/article/details/10179013

一、定位模块的需求:我们想知道使用我们应用的用户的大概位置,每隔五分钟上传一次用户当前所在地的经纬度值到服务器端。

二、需求分析

     A、UML流程图如下:

    B、定位服务,功能具体分析:

      启动方式:手动、开机自启动。
      关闭方式:用户在设置里强制停止应用、关闭手机。(用户使用其他软件杀死掉我们的服务,用户重新启动应用服务才会开启。)
      1、开机自启动服务,等1分钟后开始检测网络状态和GPS是否开启,并通过通知栏提醒用户。(未开启时,提醒一次,5分钟提醒一次)
      2、直接启动应用,立即开始检测网络状态和GPS是否开启,并通过弹Dialog提示用户。若用户不愿意开启网络,即网络不可用时,直接退出应用。
     3、用户在设置-->应用程序-->正在运行的服务里面手动停止掉服务后,服务自动重启。
     4、网络检测可用,开始检测GPS。用户不开启GPS时,使用基站定位(WLAN、3G/2G)。
     5、网络检测可用,启动百度地图定位服务,每隔五分钟确认一次当前我所在的位置,并将经纬度值上传服务器端。
     6、网络检测可用,但是在发送定位数据时,网络断开了,以Toast形式提醒用户。
     7、网络检测可用,但是在定位过程中,网络断开了,并且目前打开的不是我们的应用(也就是说服务在后台运行),以通知的形式提醒用户。
     8、服务运行过程中,意外停止了。当用户重启应用后,服务重新启动。
     9、添加了开机自启动后,检测网络和通过通知栏提醒用户当前的网络、GPS状态。
    10、服务运行过程中,网络检测返回的标识的处理。

三、编码实现:

      完整源码下载地址:http://download.csdn.net/detail/android_ls/5993623核心类的源码如下,

      A、服务类的源码如下:

[java] view plaincopy
  1. package com.android.mobile.locator;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  
  7.   
  8. import android.app.Service;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.SharedPreferences;  
  12. import android.os.Handler;  
  13. import android.os.IBinder;  
  14. import android.os.Message;  
  15.   
  16. import com.android.mobile.locator.net.HttpRequester;  
  17. import com.android.mobile.locator.utils.Constant;  
  18. import com.android.mobile.locator.utils.FileUtil;  
  19. import com.android.mobile.locator.utils.GPSUtil;  
  20. import com.android.mobile.locator.utils.LogUtil;  
  21. import com.android.mobile.locator.utils.NetWorkUtil;  
  22. import com.android.mobile.locator.utils.NotificationUtil;  
  23. import com.android.mobile.locator.utils.ServiceUtil;  
  24. import com.baidu.location.BDLocation;  
  25. import com.baidu.location.BDLocationListener;  
  26. import com.baidu.location.LocationClient;  
  27. import com.baidu.location.LocationClientOption;  
  28. import com.easi.mobile.locator.R;  
  29.   
  30. /** 
  31.  * 类名:MobileLocatorService 
  32.  * 功能描述:定位服务类。 
  33.  * @author android_ls 
  34.  * 创建日期:2013-2-18 
  35.  */  
  36. public class MobileLocatorService extends Service {  
  37.   
  38.     /** 
  39.      * Service action. 
  40.      */  
  41.     public static final String ACTION_MOBILE_LOCATOR_SERVICE = "com.easi.mobile.locator.MobileLocatorService";  
  42.   
  43.     /** 
  44.      * 间隔时间5分钟 
  45.      */  
  46.      private static final int DELAY_TIME = 5*60*1000;  
  47.   
  48.     /** 
  49.      * 开机一分钟后开始检测网络 
  50.      */  
  51.     private static final int CHECK_NETWORK_DELAY_TIME = 1 * 60 * 1000;  
  52.   
  53.     private Context mContext;  
  54.   
  55.     /** 
  56.      * 定位SDK的核心类 
  57.      */  
  58.     private LocationClient mLocationClient;  
  59.   
  60.     /** 
  61.      * 定位结果处理器 # class MyLocationListener implements BDLocationListener{} 
  62.      */  
  63.     private MyLocationListener mLocationListener;  
  64.   
  65.     /** 
  66.      * 通知工具类 
  67.      */  
  68.     private NotificationUtil mNotificationUtil;  
  69.   
  70.     /** 
  71.      * 服务的启动方式,开机自启动/手动启动 
  72.      */  
  73.     private int startingMode = -1;  
  74.   
  75.     /** 
  76.      * 当前网络是否可用的标志 
  77.      */  
  78.     private boolean isOpenNetwork = false;  
  79.   
  80.     /** 
  81.      * 检测网络的次数(5分钟一次,检测三次) 
  82.      */  
  83.     private int checkNetworkNumber = 0;  
  84.   
  85.     /** 
  86.      * 定时器 
  87.      */  
  88.     private Timer mTimer;  
  89.   
  90.     @Override  
  91.     public IBinder onBind(Intent intent) {  
  92.         return null;  
  93.     }  
  94.   
  95.     @Override  
  96.     public void onCreate() {  
  97.         LogUtil.e("--------------MobileLocatorService onCreate()----------------");  
  98.   
  99.         mNotificationUtil = new NotificationUtil(this);  
  100.   
  101.         mContext = MobileLocatorService.this;  
  102.   
  103.         // 设置为前台进程,尽量避免被系统干掉。  
  104.         // MobileLocatorService.this.setForeground(true);  
  105.   
  106.         // 初始化定位服务,配置相应参数  
  107.         initLocationService();  
  108.   
  109.     }  
  110.   
  111.     @Override  
  112.     public int onStartCommand(Intent intent, int flags, int startId) {  
  113.         LogUtil.e("--------------MobileLocatorService onStartCommand()----------------");  
  114.   
  115.         if (intent != null) {  
  116.             startingMode = intent.getIntExtra("startingMode", -1);  
  117.             LogUtil.i("startingMode = " + startingMode);  
  118.             if (startingMode == Constant.HANDLER_START_SERVICE) {  
  119.   
  120.                 LogUtil.e("-------------手动启动---------------");  
  121.                   
  122.                 // 判断服务是否已开启  
  123.                 boolean isRun = ServiceUtil.isServiceRun(getApplicationContext(), "com.baidu.location.f");  
  124.                 LogUtil.i("isRun = " + isRun);  
  125.                 if (isRun == false) {  
  126.                     LogUtil.e("MobileLocatorService start Location Service");  
  127.   
  128.                     // 没启动,开启定位服务  
  129.                     mLocationClient.start();  
  130.                 }  
  131.             } else {  
  132.                 // 关闭手机,再次开启手机。这种情况下,startingMode的值获取不到。  
  133.                 // 关机重启,这种情况下,startingMode的值可以拿到。  
  134.                 // if (startingMode == Constant.BOOT_START_SERVICE) {  
  135.   
  136.                 LogUtil.e("-------------开机自启动---------------");  
  137.   
  138.                 checkNetworkNumber++;  
  139.   
  140.                 // 第一次,1分钟后检测网络  
  141.                 mHandler.postDelayed(new Runnable() {  
  142.   
  143.                     @Override  
  144.                     public void run() {  
  145.   
  146.                         LogUtil.e("--------------第一次检测网络---------------");  
  147.   
  148.                         checkNetwork();  
  149.   
  150.                         Message msg = new Message();  
  151.                         msg.arg1 = Constant.CHECK_NETWORK_CONNECT_FLAG;  
  152.                         mHandler.sendMessage(msg);  
  153.   
  154.                     }  
  155.                 }, CHECK_NETWORK_DELAY_TIME);  
  156.   
  157.             }  
  158.   
  159.         }  
  160.   
  161.         return Service.START_REDELIVER_INTENT;  
  162.     }  
  163.   
  164.     /** 
  165.      * 检测网络是否可用 
  166.      */  
  167.     private void checkNetwork() {  
  168.         // 如果网络不可用,开启GPS就没有意义  
  169.         if (NetWorkUtil.isNetworkAvailable(mContext)) {  
  170.             isOpenNetwork = true;  
  171.   
  172.             if (GPSUtil.isOPen(mContext) == false) {  
  173.                 // 通知用户GPS未开启  
  174.                 mNotificationUtil.sendGPSNotification();  
  175.             }  
  176.   
  177.             LogUtil.i("MobileLocatorService start Location Service");  
  178.   
  179.             // 开启定位服务  
  180.             mLocationClient.start();  
  181.   
  182.         } else {  
  183.             // 通知用户网络不可用  
  184.             mNotificationUtil.sendNetworkNotification();  
  185.         }  
  186.     }  
  187.   
  188.     /** 
  189.      * 初始化定位服务,配置相应参数 
  190.      */  
  191.     private void initLocationService() {  
  192.         mLocationClient = new LocationClient(this.getApplicationContext());  
  193.         mLocationListener = new MyLocationListener();  
  194.         mLocationClient.registerLocationListener(mLocationListener);  
  195.   
  196.         LocationClientOption locationOption = new LocationClientOption();  
  197.         locationOption.setOpenGps(true);  
  198.         locationOption.setCoorType("bd09ll");  
  199.         locationOption.disableCache(true);  
  200.         locationOption.setPriority(LocationClientOption.GpsFirst);  
  201.         locationOption.setScanSpan(DELAY_TIME);  
  202.         locationOption.setProdName(this.getString(R.string.loaction_prod_name));  
  203.   
  204.         mLocationClient.setLocOption(locationOption);  
  205.     }  
  206.   
  207.     Handler mHandler = new Handler() {  
  208.   
  209.         @Override  
  210.         public void handleMessage(Message msg) {  
  211.             int result = msg.arg1;  
  212.   
  213.             switch (result) {  
  214.             case Constant.CHECK_NETWORK_CONNECT_FLAG:  
  215.   
  216.                 // 第一检测网络,直接过了。(已打开)  
  217.                 boolean isRun = ServiceUtil.isServiceRun(getApplicationContext(), "com.baidu.location.f");  
  218.                 LogUtil.i("isRun = " + isRun);  
  219.                 if (isOpenNetwork && isRun) {  
  220.                     LogUtil.i("--------------第一次检测网络,直接过了。(已打开)----------------");  
  221.                     return;  
  222.                 }  
  223.   
  224.                 mTimer = new Timer();  
  225.                 mTimer.schedule(new TimerTask() {  
  226.   
  227.                     @Override  
  228.                     public void run() {  
  229.                         checkNetworkNumber++;  
  230.                         LogUtil.i("Timer checkNetworkNumber = " + checkNetworkNumber);  
  231.   
  232.                         checkNetwork();  
  233.   
  234.                         boolean isRun = ServiceUtil.isServiceRun(getApplicationContext(), "com.baidu.location.f");  
  235.                         if (isOpenNetwork && isRun) {  
  236.                             mNotificationUtil.cancelNotification(Constant.NOTIFICATIO_NETWORK_NOT_OPEN);  
  237.                             mTimer.cancel();  
  238.                             return;  
  239.                         } else {  
  240.                             if (checkNetworkNumber == 3) {  
  241.   
  242.                                 LogUtil.e("--------------第三次检测网络,还未开启,直接退出应用---------");  
  243.   
  244.                                 // 检查网络,提醒了用户三次依然未开,退出应用。  
  245.                                 mNotificationUtil.cancelNotification(Constant.NOTIFICATIO_NETWORK_NOT_OPEN);  
  246.                                 mNotificationUtil.cancelNotification(Constant.NOTIFICATIO_GPS_NOT_OPEN);  
  247.                                 mTimer.cancel();  
  248.   
  249.                                 // System.gc();  
  250.                                 System.exit(0);  
  251.                             }  
  252.                         }  
  253.                     }  
  254.                 }, 0, DELAY_TIME);  
  255.   
  256.                 break;  
  257.   
  258.             case Constant.UPLOAD_LOACTION_SUCCESS:  
  259.                 LogUtil.i("您当前的位置上传服务器成功!");  
  260.                 // Toast.makeText(getApplicationContext(), "您当前的位置上传服务器成功!", Toast.LENGTH_LONG).show();          
  261.                 break;  
  262.   
  263.             case Constant.LOCATION_NETWORK_EXCEPTION:  
  264.                 LogUtil.e("网络异常!请检查您的网络连接。");  
  265.                 //  网络异常,没有成功向服务器发起请求。  
  266.                 // Toast.makeText(getApplicationContext(), "网络异常!请检查您的网络连接。", Toast.LENGTH_LONG).show();  
  267.   
  268.                 // 通知用户网络不可用  
  269.                 mNotificationUtil.sendNetworkNotification();  
  270.                 break;  
  271.   
  272.             case Constant.LOCATION_NETWORK_CONNECT_FAIL:  
  273.                 LogUtil.e("网络连接失败,请将网络关闭再重新打开试试!");  
  274.   
  275.                 // 通知用户网络不可用  
  276.                 mNotificationUtil.sendNetworkNotification();  
  277.                 break;  
  278.   
  279.             case Constant.UPLOAD_LOACTION_FAIL:  
  280.                 // Toast.makeText(getApplicationContext(), "您当前的位置上传服务器失败!请查看下你的网络状态。", Toast.LENGTH_LONG).show();  
  281.                 LogUtil.e("您当前的位置上传服务器失败!");  
  282.                 break;  
  283.   
  284.             default:  
  285.                 break;  
  286.             }  
  287.         }  
  288.     };  
  289.   
  290.       
  291.     class MyLocationListener implements BDLocationListener {  
  292.         double longitude;  
  293.   
  294.         double latitude;  
  295.   
  296.         @Override  
  297.         public void onReceiveLocation(BDLocation location) {  
  298.             if (location == null) {  
  299.                 return;  
  300.             }  
  301.   
  302.             LogUtil.i("BDLocationListener onReceiveLocation()");  
  303.   
  304.             /* location.getLocType()的返回值含义: 
  305.                61 : GPS定位结果 
  306.                62 : 扫描整合定位依据失败。此时定位结果无效。 
  307.                63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。 
  308.                65 : 定位缓存的结果。 
  309.                66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果 
  310.                67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果 
  311.                68 : 网络连接失败时,查找本地离线定位时对应的返回结果 
  312.                161: 表示网络定位结果 
  313.                162~167: 服务端定位失败。*/  
  314.             int locType = location.getLocType();  
  315.   
  316.             longitude = location.getLongitude();  
  317.             latitude = location.getLatitude();  
  318.   
  319.             // TODO 调试使用  
  320.             StringBuffer sb = new StringBuffer(256);  
  321.             sb.append(" time : ");  
  322.             sb.append(location.getTime());  
  323.             sb.append("\n error code : ");  
  324.             sb.append(locType);  
  325.             sb.append("\n latitude : ");  
  326.             sb.append(longitude);  
  327.             sb.append("\n longitude : ");  
  328.             sb.append(latitude);  
  329.             LogUtil.i("BDLocationListene " + sb.toString());  
  330.   
  331.             if (locType == Constant.LOCATION_GPS || locType == Constant.LOCATION_NETWORK) {  
  332.   
  333.                  //  GPS定位结果、网络定位结果  
  334.                  mHandler.post(new Runnable() {  
  335.   
  336.                      @Override  
  337.                      public void run() {  
  338.                          String userId = "bgao";  
  339.                          int result = send(userId, longitude, latitude);  
  340.                            
  341.                          Message msg = new Message();  
  342.                          msg.arg1 = result;  
  343.                          mHandler.sendMessage(msg);  
  344.                      }  
  345.                  });  
  346.   
  347.             } else if (locType == Constant.LOCATION_NETWORK_EXCEPTION || locType == Constant.LOCATION_NETWORK_CONNECT_FAIL) {  
  348.                 //  网络异常,没有成功向服务器发起请求。  
  349.                 Message msg = new Message();  
  350.                 msg.arg1 = locType;  
  351.                 mHandler.sendMessage(msg);  
  352.             }  
  353.         }  
  354.   
  355.         @Override  
  356.         public void onReceivePoi(BDLocation arg0) {  
  357.   
  358.         }  
  359.     }  
  360.   
  361.     /** 
  362.      * 向服务器端当前位置的经纬度 
  363.      * @param usetId 用户ID 
  364.      * @param longitude 经度值 
  365.      * @param latitude 纬度值 
  366.      */  
  367.     private int send(String usetId, double longitude, double latitude) {  
  368.         StringBuffer params = new StringBuffer();  
  369.         params.append("event=save");  
  370.         params.append("¤tPointX=");  
  371.         params.append(longitude);  
  372.         params.append("¤tPointY=");  
  373.         params.append(latitude);  
  374.         params.append("&userId=");  
  375.         params.append(usetId);  
  376.   
  377.         try {  
  378.             InputStream inputStream = HttpRequester.post(Constant.UPLOAD_GPS_URL, params);  
  379.             if (inputStream != null) {  
  380.                 String result = new String(FileUtil.read(inputStream));  
  381.                 String time = (new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(System.currentTimeMillis());  
  382.                 LogUtil.e("网络请求返回的结果:result = " + result + "\t 时间:" + time);  
  383.   
  384.                 if ("Y".equals(result)) {  
  385.                     return 1;  
  386.                 } else if ("N".equals(result)) {  
  387.                     return 0;  
  388.                 } else {  
  389.                     LogUtil.e("服务器端返回的值与预先商定的不否! ");  
  390.                 }  
  391.             } else {  
  392.                 LogUtil.e("网络请求成功,但是返回的数据流为NULL");  
  393.             }  
  394.         } catch (IOException e) {  
  395.             LogUtil.e("IOException 服务器访问失败!");  
  396.             e.printStackTrace();  
  397.             return 0;  
  398.         }  
  399.   
  400.         return 0;  
  401.     }  
  402.   
  403.     @Override  
  404.     public void onDestroy() {  
  405.         LogUtil.e("---------------MobileLocatorService onDestroy()----------------");  
  406.   
  407.         if (mLocationClient != null && mLocationClient.isStarted()) {  
  408.             mLocationClient.stop();  
  409.             if (mLocationListener != null) {  
  410.                 mLocationClient.unRegisterLocationListener(mLocationListener);  
  411.             }  
  412.         }  
  413.   
  414.         SharedPreferences sp = mContext.getSharedPreferences("MobileLocator", Context.MODE_PRIVATE);  
  415.         String result = sp.getString("instruct"null);  
  416.         LogUtil.i("MobileLocatorService onDestroy() result = " + result);  
  417.         if ("exit".equals(result)) {  
  418.             sp.edit().putString("instruct""true").commit();  
  419.             LogUtil.e("---------------MobileLocatorService onDestroy()-----------1-----");  
  420.             System.exit(0);  
  421.             return;  
  422.         }  
  423.   
  424.         LogUtil.e("---------------MobileLocatorService onDestroy()---------2-------");  
  425.   
  426.         // 销毁时重新启动Service  
  427.         Intent intent = new Intent(ACTION_MOBILE_LOCATOR_SERVICE);  
  428.         intent.putExtra("startingMode", startingMode);  
  429.         this.startService(intent);  
  430.     }  
  431.   
  432. }  

       B、启动时系统发出的广播的接收器类源码:

[java] view plaincopy
  1. package com.android.mobile.locator;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6.   
  7. import com.android.mobile.locator.utils.Constant;  
  8. import com.android.mobile.locator.utils.LogUtil;  
  9.   
  10. /** 
  11.  * 类名:BootBroadcastReceiver  
  12.  * 功能描述:启动时系统发出的广播的接收器 
  13.  * #<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
  14.  * @author android_ls 
  15.  */  
  16. public class BootBroadcastReceiver extends BroadcastReceiver {  
  17.   
  18.     private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";  
  19.   
  20.     @Override  
  21.     public void onReceive(Context context, Intent intent) {  
  22.         LogUtil.i("Boot this system , BootBroadcastReceiver onReceive()");  
  23.           
  24.         if (intent.getAction().equals(ACTION_BOOT)) {  
  25.             LogUtil.i("BootBroadcastReceiver onReceive(), MobileLocatorService Start");  
  26.               
  27.             Intent mIntent = new Intent(MobileLocatorService.ACTION_MOBILE_LOCATOR_SERVICE);  
  28.             mIntent.putExtra("startingMode", Constant.BOOT_START_SERVICE);  
  29.             context.startService(mIntent);  
  30.         }  
  31.   
  32.     }  
  33.   
  34. }  

      C、关机时系统发出的广播的接收器类源码:

[java] view plaincopy
  1. package com.android.mobile.locator;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.SharedPreferences;  
  7.   
  8. import com.android.mobile.locator.utils.LogUtil;  
  9.   
  10. /** 
  11.  * 类名:ShutdownBroadcastReceiver 
  12.  * 功能描述:关机时系统发出的广播的接收器 
  13.  * @author android_ls 
  14.  */  
  15. public class ShutdownBroadcastReceiver extends BroadcastReceiver {  
  16.   
  17.     private static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";  
  18.       
  19.     @Override  
  20.     public void onReceive(Context context, Intent intent) {  
  21.         LogUtil.e("Shut down this system, ShutdownBroadcastReceiver onReceive()");  
  22.           
  23.         if (intent.getAction().equals(ACTION_SHUTDOWN)) {  
  24.             LogUtil.i("ShutdownBroadcastReceiver onReceive(), MobileLocatorService Stop");  
  25.               
  26.             SharedPreferences sp = context.getSharedPreferences("MobileLocator", Context.MODE_PRIVATE);  
  27.             sp.edit().putString("instruct""exit").commit();  
  28.               
  29.             context.stopService(new Intent(MobileLocatorService.ACTION_MOBILE_LOCATOR_SERVICE));  
  30.         }  
  31.   
  32.     }  
  33.   
  34. }  

       D、在AndroidManifest.xml文件中的配置:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.easi.mobile.locator"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <!--  
  10.     android:sharedUserId="android.uid.system"  
  11.     android:killAfterRestore="true"  
  12.     android:process=":remote"    
  13.     android:enabled="true"  
  14.     -->  
  15.   
  16.     <application  
  17.         android:allowClearUserData="false"  
  18.         android:icon="@drawable/ic_launcher"  
  19.         android:label="@string/app_name" >  
  20.         <activity  
  21.             android:label="@string/app_name"  
  22.             android:name="com.android.mobile.locator.MobileLocatorActivity" >  
  23.             <intent-filter >  
  24.                 <action android:name="android.intent.action.MAIN" />  
  25.   
  26.                 <category android:name="android.intent.category.LAUNCHER" />  
  27.             </intent-filter>  
  28.         </activity>  
  29.   
  30.         <service  
  31.             android:enabled="true"  
  32.             android:name="com.android.mobile.locator.MobileLocatorService"  
  33.             android:process=":remote" >  
  34.             <intent-filter >  
  35.                 <action android:name="com.easi.mobile.locator.MobileLocatorService" />  
  36.             </intent-filter>  
  37.         </service>  
  38.         <service  
  39.             android:enabled="true"  
  40.             android:name="com.baidu.location.f"  
  41.             android:process=":remote" />  
  42.   
  43.         <receiver android:name="com.android.mobile.locator.BootBroadcastReceiver" >  
  44.             <intent-filter >  
  45.                 <action android:name="android.intent.action.BOOT_COMPLETED" />  
  46.                 <category android:name="android.intent.category.HOME" />   
  47.             </intent-filter>  
  48.         </receiver>  
  49.         <receiver android:name="com.android.mobile.locator.ShutdownBroadcastReceiver" >  
  50.             <intent-filter >  
  51.                 <action android:name="android.intent.action.ACTION_SHUTDOWN" />  
  52.                 <category android:name="android.intent.category.HOME" />  
  53.             </intent-filter>  
  54.         </receiver>  
  55.     </application>  
  56.   
  57.     <!-- 授予应用程序访问系统开机事件的权限 -->  
  58.     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
  59.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  60.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  61.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  62.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  63.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  64.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  65.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  66.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  67.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
  68.     <uses-permission android:name="android.permission.READ_LOGS" />  
  69.     <uses-permission android:name="android.permission.INTERNET" />  
  70.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
  71.   
  72. </manifest>  



      前段时间由于忙于公司的项目,所以好久没更新博客了,后面我会继续更新的,谢谢大家的支持!

0 0
原创粉丝点击