運行時權(quán)限

自從6.0開始,SD卡的讀寫也需要獲取運行時權(quán)限。我們應(yīng)盡量避免去動態(tài)獲取SD卡權(quán)限,而是將文件緩存在Android/data/應(yīng)用包名路徑下,此路徑不需要獲取權(quán)限,而且當(dāng)應(yīng)用刪除時此路徑也會刪除

        //在Android/data/應(yīng)用包名/cache下,一般放一些不重要的數(shù)據(jù),因為可能會被垃圾清理程序清除
        File file=getExternalCacheDir();//
       
        //重要的文件可以存在Android/data/應(yīng)用包名/files下,一般放一些長時間保存的數(shù)據(jù)
        getExternalFilesDir("");
        //如果是getExternalFilesDir("abc") 則會在files下新建一個abc目錄

下面以獲取撥打電話的例子來講解運行時權(quán)限

Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:13426112458"));
startActivity(intent);

記得在清單文件里添加<uses-permission android:name="android.permission.CALL_PHONE" />

  • 當(dāng)項目的gradle中,targetSdkVersion<23時,運行程序,不會請求運行時權(quán)限。
  • 當(dāng)我們把targetSdkVersion改為23或者是23以上再運行程序,發(fā)現(xiàn)還是沒有請求運行時權(quán)限。這是因為應(yīng)用升級時會把之前請求道的權(quán)限帶到新升級到的版本。

一般寫法

//判斷 如果沒有撥打電話的權(quán)限
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED) 
    {    
    //請求撥打電話的權(quán)限
    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},101);
    } else {    
           callPhone();
}

請求權(quán)限的回調(diào)

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 101:
                //判斷是否獲取到權(quán)限
                if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    //請求到權(quán)限
                    callPhone();
                }else{
                    Toast.makeText(MainActivity.this,"權(quán)限被拒絕",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }```
有一點需要注意:撥打電話的方法需要添加權(quán)限異常
``` private void callPhone() {
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:13426112458"));
            startActivity(intent);
        }catch (SecurityException e){//權(quán)限異常,因為有可能在任何地方在沒有請求權(quán)限的情況下調(diào)用callPhone()方法

        }
    }

如果需要同時獲取多個權(quán)限

List<String> permissionList = new ArrayList<String>();

                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.CALL_PHONE);
                }
            //注意讀寫sd卡權(quán)限需要在清單文件里注冊
                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }

                if (!permissionList.isEmpty()) {//permissionList不為空,說明有權(quán)限需要動態(tài)獲取
                    //注意第二個參數(shù)如何將List轉(zhuǎn)換為數(shù)組
                    ActivityCompat.requestPermissions(MainActivity.this, permissionList.toArray(new String[permissionList.size()]), 101);
                } else {
                    doSomeThing();
                }```
權(quán)限請求的回調(diào)
```    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 101:
                if (grantResults.length > 0) {
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MainActivity.this, permissions[i] + "權(quán)限被拒絕", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, permissions[i] + "權(quán)限被允許", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
                break;
            default:
                break;
        }
    }

封裝運行時權(quán)限的獲取

一般我們的應(yīng)用中都會有一個BaseActivity,其他的Activity都要繼承這個BaseActivity。我們將運行時權(quán)限的代碼封裝進BaseActivity

public class BaseActivity extends Activity {
    PermissionListener mListener;

    public void requestRuntimePermissions(String[] permissions, PermissionListener listener) {
        mListener = listener;
        List<String> listPermission = new ArrayList<>();
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                listPermission.add(permission);
            }
        }
        if (listPermission.isEmpty()) {//所有權(quán)限都以獲取
            mListener.onSuccess();
        } else {
            ActivityCompat.requestPermissions(this, listPermission.toArray(new String[listPermission.size()]), 1);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && requestCode == 1) {
            List<String> deniedPermissions = new ArrayList<>();//被拒絕的權(quán)限列表
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {//被拒絕
                    deniedPermissions.add(permissions[i]);
                }
            }
            if (deniedPermissions.isEmpty()) {//沒有被拒絕的權(quán)限
                mListener.onSuccess();
            } else {
                mListener.onFailed(deniedPermissions);
            }
        }
    }
}```
接口很簡單,就一個成功跟失敗的回調(diào),這里就不添加了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 6.0 運行時權(quán)限處理完全解析 運行時權(quán)限的變化及特點 對于6.0以下的權(quán)限及在安裝的時候,根據(jù)權(quán)...
    愛因私談閱讀 573評論 0 1
  • 之前調(diào)試的時候,出現(xiàn)了一個問題,就是當(dāng)我打開二維碼掃描界面的時候,對于一部分手機一直不會出現(xiàn)那個掃描框,這點我也很...
    f2a928cacb8d閱讀 778評論 3 3
  • 權(quán)限分為兩大類:Normal Permissions Dangerous Permission 特點:對于6.0以...
    傲嬌的狗蛋閱讀 377評論 0 0
  • 去大阪是第一回自由行,講道理還是挺有意思的。雖然前期的準(zhǔn)備很是讓人抓狂和腦袋發(fā)漲,一個人用APP辦簽證,一個人訂機...
    歐欠君閱讀 342評論 0 3
  • 01 初識王小愛時,她跟著論壇的一個攝影團體剛從烏江采風(fēng)回來,脖子上掛著大相機,頭上壓了一頂大檐帽,正對著一張小鏡...
    亦虹閱讀 495評論 1 7

友情鏈接更多精彩內(nèi)容