Android 6.0動的権限申請

5971 ワード

動的権限申請:GoogleはAndroid 6.0から権限申請メカニズムを導入し、すべての権限を正常権限と危険権限に分けた.アプリケーションの関連機能は、危険制限を使用するたびに動的に申請し、ユーザーの許可を得る必要があります.
通常の権限:ユーザーのプライバシーに直接リスクをもたらすことはありません.アプリケーションがリストに通常の権限をリストしている場合、システムは自動的に権限を付与します.
≪危険権限|Hard Privileges|emdw≫:ユーザーの機密データにアクセスする権限が付与されます.アプリケーションがリストに通常の権限をリストしている場合、システムは自動的に権限を付与します.危険権限がリストされている場合は、ユーザーはアプリケーションがこれらの権限を使用することを明確に承認する必要があります.
重要な方法
1.ContextCompat.checkSelfPermission()アプリケーションに危険な権限があるかどうかを確認します.この権限が適用された場合、メソッドはPackageManagerに戻ります.PERMISSION_GRANTEDは、アプリケーションが動作を継続することができる.アプリケーションにこの権限がない場合、メソッドはPackageManagerに戻ります.PERMISSION_DENIEDは、アプリケーションがユーザーに権限を明確に要求する必要があります.2.ActivityCompat.requestPermissions()アプリケーションでは、このメソッドを使用して権限を動的に申請できます.呼び出されると、申請した権限を許可するダイアログボックスが表示されます.3.ActivityCompat.shouldShowRequestPermissionRationale()この権限が適用される前に要求されたが、ユーザーが要求を拒否した場合、このメソッドはtrueを返します.ユーザーが過去に権限要求を拒否し、権限要求システムダイアログボックスでDon't ask againオプションを選択した場合、このメソッドはfalseを返します.4.onRequestPermissionsResult()リクエスト権限を適用すると、ユーザーにダイアログボックスが表示されます.ユーザが応答すると、アプリケーションのonRequestPermissionsResult()メソッドが呼び出され、ユーザ応答が伝達され、対応するシーンが処理されます.
例:購買依頼権限のツールクラスを書きます.
package com.example.jiaho.baidumapproject;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

//        
public class PermissionUtils {
    private Activity mActivity;
    private int mReqCode;
    private CallBack mCallBack;

    //        
    public static interface CallBack{
        //  
        void grantAll();
        //  
        void denied();
    }

    //        
    public PermissionUtils(Activity activity) {
        this.mActivity = activity;
    }

    //         
    @RequiresApi(api = Build.VERSION_CODES.M)
    public void request(List needPermissions, int reqCode, CallBack callBack){

        mReqCode=reqCode;
        mCallBack=callBack;

        //  6.0           
        if (Build.VERSION.SDK_INT < 23){
            //6.0           
            callBack.grantAll();
            return;
        }

        //  ,     
        if (mActivity==null){
            throw  new IllegalArgumentException("activity is null.");
        }


        //        ,          
        List reqPermission =new ArrayList<>();
        for (String permission:needPermissions){
            if (mActivity.checkSelfPermission(permission)!= PackageManager.PERMISSION_GRANTED){
                reqPermission.add(permission);
            }
        }

        //          ,     
        if (reqPermission.isEmpty()){
            callBack.grantAll();
            return;
        }

        //      
        mActivity.requestPermissions(reqPermission.toArray(new String[]{}),reqCode);

    }

    //         
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        if (requestCode==mReqCode){
            boolean grantAll = true;

            //         
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i]!=PackageManager.PERMISSION_GRANTED){
                    grantAll=false;
                    Toast.makeText(mActivity,permissions[i]+"   ",Toast.LENGTH_SHORT).show();
                    break;
                }
            }

            if (grantAll){
                mCallBack.grantAll();
            }else {
                mCallBack.denied();
            }
        }
    }
}

Activityでの適用:
package com.example.jiaho.baidumapproject;

import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

public class SplashActivity extends AppCompatActivity {

    private static List sNeedPermissions=new ArrayList<>();

    private PermissionUtils permissionUtils= null;

    //             
    static {
        sNeedPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        sNeedPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
        sNeedPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE);
        sNeedPermissions.add(Manifest.permission.INTERNET);
        sNeedPermissions.add(Manifest.permission.READ_PHONE_STATE);
        sNeedPermissions.add(Manifest.permission.READ_SYNC_SETTINGS);
        sNeedPermissions.add(Manifest.permission.ACCESS_WIFI_STATE);
        sNeedPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        sNeedPermissions.add(Manifest.permission.CAMERA);
        sNeedPermissions.add(Manifest.permission.CHANGE_WIFI_STATE);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        permissionUtils=new PermissionUtils(this);

        permissionUtils.request(sNeedPermissions, 100, new PermissionUtils.CallBack() {
            @Override
            public void grantAll() {
                toMainActivity();
                finish();
            }

            @Override
            public void denied() {
                fileList();
            }
        });

    }


    public void toMainActivity(){
        //   Activity
        startActivity(new Intent(SplashActivity.this,MainActivity.class));
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        permissionUtils.onRequestPermissionsResult(requestCode,permissions,grantResults);
    }
}