1. 程式人生 > >Android執行時動態申請許可權完整例項

Android執行時動態申請許可權完整例項

前言

在Android6.0之前,我們安裝App時會列出安裝的App的訪問許可權,並且只有安裝時會出現一次。一旦我們同意安裝了此App,這個App就可以在使用者毫不知情的情況下訪問許可權內的所有東西。eg:使用者的通訊資訊,使用者位置等資訊,這會侵犯使用者的隱私。在Android6.0以後就不會在出現安裝時授予許可權,取而代之的是,App必須在執行時詢問使用者來授予許可權。

直接上程式碼eg:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super
.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.findViewById(R.id.tv_callPhone).setOnClickListener(new View.OnClickListener() { @SuppressLint("MissingPermission") @Override public void onClick(View v) { call(); } }); } /**
* 檢查許可權 */ private void call() { /** * 檢查App是否有permission.CALL_PHONE許可權,就申請許可權 */ if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { /** * 沒有permission.CALL_PHONE許可權,就申請許可權
*/ ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 66); } else { callPhone(); } } /** * 撥打電話 */ @SuppressLint("MissingPermission") private void callPhone() { Intent intent = new Intent(Intent.ACTION_CALL); Uri uri = Uri.parse("tel:" + 10085); intent.setData(uri); startActivity(intent); } /** * 申請許可權的回撥結果 * * @param requestCode 請求碼 * @param permissions 請求許可權 * @param grantResults 授權結果 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 66) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { callPhone(); } else { Toast.makeText(this,"許可權被拒絕",Toast.LENGTH_LONG).show(); } } } }

當我們點選呼叫call方法,call方法首先判斷APP是否有permission.CALL_PHONE許可權,如果有直接呼叫callPhone方法來撥打電話,否則彈出提示框,如下:


onRequestPermissionsResult就是申請許可權的回撥,如果點選允許,則呼叫callPhone方法,否則執行
如果我們勾選了該選項,則下一次就不會彈出許可權申請提示框,而直接呼叫onRequestPermissionsResult,回撥結果為使用者最後一次的選擇,也就是:
Toast.makeText(this,"許可權被拒絕",Toast.LENGTH_LONG).show()。
再次開啟該許可權:在手機:設定----->應用------->配置應用-------->應用許可權----->

處理 不在詢問  選項:

如果使用者選擇了  不在詢問  選項,那麼每次呼叫許可權都會失敗,這給使用者帶來很不好的體驗,所以我們要給使用者一個友好的提示
shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)方法會返回false,
我們可以做個彈出框給使用者一個提示,如下程式碼:

 if (requestCode == 66) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            callPhone();
        } else {
            if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {

                AlertDialog alertDialog = new AlertDialog.Builder(this)
                        .setMessage("提示")
                        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
public void onClick(DialogInterface dialog, int which) {
                                
                            }
                        })
                        .create();

                alertDialog.show();
            }
            Toast.makeText(this, "許可權被拒絕", Toast.LENGTH_LONG).show();
        }
    }
}

到此結束!!!