Google 運行時請求權限處理

Google 7.0版本開始,需要在代碼中加入權限檢查。否則,就無法上Google Play商店。
相關文檔:https://developer.android.com/training/permissions/requesting.html
不過,文檔十分含糊,不踩幾個坑是不可能搞清楚的。

在此我列出相關API,並加以說明
ActivityCompat.requestPermissions 請求權限,如果部分權限需要用戶確認,就好彈出系統消息框,確認是否 開啓權限。

Activity.onRequestPermissionsResult 請求權限結果回調接口,需要在主Activity中實現。

ContextCompat.checkSelfPermission 檢查是否有請求

Activity.shouldShowRequestPermissionRationale 檢查是否點選了“禁止後不再詢問”選項。

以下爲參考代碼

public class MainActivity extends NativeActivity
{
    private static final int PERMISSION_REQUEST_CODE = 200;
    //需要檢查的權限列表
    private static final String[] permissions = new String[]
    {
        "android.permission.WRITE_EXTERNAL_STORAGE",
        "android.permission.READ_PHONE_STATE",
        "android.permission.SEND_SMS",
        "android.permission.GET_ACCOUNTS",
        "android.permission.RECEIVE_SMS",
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //檢查權限
        requestPermissions(permissions);
        super.onCreate();
    }

    /**
     * 權限檢查函數
     */
    private void requestPermissions(String[] permissions)
    {
        if(permissions == null || permissions.length == 0)
            return;
        ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        Log.d("SiriusActivity", "onRequestPermissionsResult requestCode="+requestCode);
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0)
                {
                    //定義拒絕權限數
                    int deny_count = 0;
                    //挑出被拒絕的權限
                    for(int i=0; i<permissions.length; ++i)
                    {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
                            //通過
                            Log.d("MainActivity", permissions[i] + " is GRANTED")
                        else
                        {
                            //權限被拒絕
                            Log.d("MainActivity", permissions[i] + " is DENIED")
                            deny_count += 1;
                        }
                    }
                    if(deny_count>0)
                        //有權限被拒絕
                        doFinishMessageBox();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    /**
     * 退出對話框
     */
    private void doFinishMessageBox()
    {
        new AlertDialog.Builder(this)
                .setMessage("警告\n" +
                        "有權限被拒絕啦!"
                )
                .setPositiveButton("確定",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //退出
                        MainActivity.instance.finish();
                    }
                })
                .setCancelable(false)
                .create()
                .show();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章