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()メソッドが呼び出され、ユーザ応答が伝達され、対応するシーンが処理されます.
例:購買依頼権限のツールクラスを書きます.
Activityでの適用:
通常の権限:ユーザーのプライバシーに直接リスクをもたらすことはありません.アプリケーションがリストに通常の権限をリストしている場合、システムは自動的に権限を付与します.
≪危険権限|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);
}
}