1. 程式人生 > >Android 6.0及以上版本定位許可權開發問題

Android 6.0及以上版本定位許可權開發問題

在開發APP過程中,發現Android 6.0版本的百度定位無法使用,查閱資料後發現android 6.0及以上系統 許可權管理變了,定位屬於隱私許可權,需要在執行時手動申請

關於Android5.0和Android6.0在許可權方面的區別:

Android5.0

對於6.0以下的許可權申請,需要在AndroidManifest.xml中進行相關配置
配置示例:

<!-- 這個許可權用於進行網路定位-->
    <permission android:name="android.permission.ACCESS_COARSE_LOCATION"></permission
>
<!-- 這個許可權用於訪問GPS定位--> <permission android:name="android.permission.ACCESS_FINE_LOCATION"></permission> <!-- 用於訪問wifi網路資訊,wifi資訊會用於進行網路定位--> <permission android:name="android.permission.ACCESS_WIFI_STATE"></permission> <!-- 獲取運營商資訊,用於支援提供運營商資訊相關的介面-->
<permission android:name="android.permission.ACCESS_NETWORK_STATE"></permission> <!-- 這個許可權用於獲取wifi的獲取許可權,wifi資訊會用來進行網路定位--> <permission android:name="android.permission.CHANGE_WIFI_STATE"></permission> <!-- 用於讀取手機當前的狀態--> <permission android:name
="android.permission.READ_PHONE_STATE">
</permission> <!-- 寫入擴充套件儲存,向擴充套件卡寫入資料,用於寫入離線定位資料--> <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></permission> <!-- 訪問網路,網路定位需要上網--> <permission android:name="android.permission.INTERNET" /> <!-- SD卡讀取許可權,使用者寫入離線定位資料--> <permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></permission>

這些許可權都是在安裝之前需要你確認申請的許可權資訊,安裝完成之後,手機的這些許可權都開啟,因此定位服務可以正常使用

Android6.0

對於Android6.0,因為其許可權修改為動態申請,因此在安裝完成啟動APP之後,進入某些需要許可權的頁面Activity,手機會彈出提示框,進行許可權申請,這個部分就是我們程式碼需要完成的部分
在CustomApplication中新增getPermissionList方法:

public List<String> getPermissionList(Activity activity){
        List<String> permission = new ArrayList<>();
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_FINE_LOCATION);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_COARSE_LOCATION);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.READ_PHONE_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_WIFI_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_NETWORK_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_NETWORK_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.INTERNET);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.CHANGE_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.CHANGE_WIFI_STATE);
        return permission;
    }

當你的Activty或者Fragment需要定位時:
首先自定義一個許可權獲取碼,用於回撥函式中做對應處理
private final int SDK_PERMISSION_REQUEST = 1;

//判斷許可權
/**
     *  onClick 集中處理函式
     *  @param v
     * */
    public void onClick(View v) {
        Intent intent;
        switch (v.getId()) {
            //跳轉到地址頁面
            case R.id.iv_upperlower:{
                intent = new Intent(this.getActivity(), LocationActivity.class);
                this.startActivity(intent);
                //this.getActivity().finish();
            }break;

            //重新整理地址
            case R.id.iv_refresh:{
                //判斷許可權
                List<String> permission = application.getPermissionList(getActivity());
                if(permission.size()>0){
                // 申請一個(或多個)許可權,並提供用於回撥返回的獲取碼(使用者定義)
                   requestPermissions(permission.toArray(new String[permission.size()]),SDK_PERMISSION_REQUEST);
                    return;
                }
                mLocationClient.stop();
                mLocationClient.start();

            }break;
        }
    }

在Activity的onRequestPermissionResult回撥函式中做處理:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode,permissions,grantResults);
        switch (requestCode){
        // requestCode即所宣告的許可權獲取碼
            case SDK_PERMISSION_REQUEST:{
                mLocationClient.stop();
                mLocationClient.start();
            }break;
        }
    }

這樣的許可權申請只需要一次,之後啟動該APP不需要再申請
許可權新增越全越好!!!
很有可能因為某個看起來不是很重要的許可權缺失導致百度地圖無法使用