天天看點

android 6.0權限封裝,android6.0運作時權限完美封裝方法

前幾天看了郭大神的運作時權限的專講,深受啟發,由于現在基于目前項目中的運作時權限封裝的還不是那麼完美,趁着郭神建議的還是曆曆在目。于是把它完整的敲了下來。并在此基礎上添加上自己的一些見解,封裝成一個完整的demo,希望與大家進行交流與。

android 6.0權限封裝,android6.0運作時權限完美封裝方法

在這裡我進行了簡單的在activity中簡單進行擷取權限和工具類封:

android 6.0權限封裝,android6.0運作時權限完美封裝方法

某一個權限被禁止或者是所有的權限被禁止,這裡我做了去到烯烴界面去設定的處理:

android 6.0權限封裝,android6.0運作時權限完美封裝方法

如果要開啟多個權限的話,則可能不同的手機顯示的效果不同,有些手機在權限Dialog上顯示需要擷取權限的個數,但有些手機需要多少個權限顯示多少個。

最後一步處理:如果某個權限被禁止的話,則到設定界面去提示使用者去打開權限:

android 6.0權限封裝,android6.0運作時權限完美封裝方法

部分代碼:

public class CheckPermissionOnActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_checkpermission1);

ButterKnife.bind(this);

}

@OnClick({R.id.btn_runtimne_onClick, R.id.btn_runtimne_onClick_multify,R.id.btn_runtimne_onClick_seting})

public void onMyListener(View v){

switch (v.getId()){

case R.id.btn_runtimne_onClick:

requestToUserPersiom(1);

break;

case R.id.btn_runtimne_onClick_multify:

requestToUserPersiom(2);

break;

case R.id.btn_runtimne_onClick_seting:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

intent.setData(Uri.parse("package:"+ getPackageName()));

startActivity(intent);

break;

}

}

public void requestToUserPersiom(int permisionIndexCount){

switch (permisionIndexCount){

case 1:

ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE},100);//去請求權限

break;

case 2:

case 3:

case 4:

ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE},100);

break;

}

}

@Override

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

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if(requestCode == 100){

if(grantResults.length >0 ){

for (int i = 0; i < grantResults.length; i++) {

if( grantResults[i] == PackageManager.PERMISSION_DENIED){//拒絕啦

return ;

}

}

doosmething();

}

}

}

public void doosmething(){

GetToast.useString(CheckPermissionOnActivity.this,"開始做其他事情了");

}

}

封裝成BaseActivitgy工具類:

public class BasePermisitionActivity extends Activity {

private static final int REQUESTPERMISSION_CODE = 100;

private static QuestPermissionListener questPermissionListener;

private AlertDialog.Builder builder;

private AlertDialog alertDialog;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityManager.addPermissionActivty(this);

}

public static void requestRuntimePermission(String [] permissions,QuestPermissionListener questPermissionListener){

Activity actyivty = ActivityManager.permissionActivilyList.get(ActivityManager.permissionActivilyList.size() -1);

if(actyivty == null){

return;

}

List neetRequestPermisList = new ArrayList();

for (String permission : permissions) {

if(ActivityCompat.checkSelfPermission(actyivty,permission) == PackageManager.PERMISSION_DENIED){

neetRequestPermisList.add(permission);

}

}

BasePermisitionActivity.questPermissionListener = questPermissionListener;

if(!neetRequestPermisList.isEmpty()){

ActivityCompat.requestPermissions(actyivty,neetRequestPermisList.toArray(new String[neetRequestPermisList.size()]),REQUESTPERMISSION_CODE);

}

}

@Override

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

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if(requestCode == REQUESTPERMISSION_CODE){

for (int i = 0; i < grantResults.length; i++) {

int granrRequest = grantResults[i];

if(granrRequest == PackageManager.PERMISSION_DENIED){//權限被拒絕啦

if(questPermissionListener != null){

questPermissionListener.denySomePermission();

}

return;

}

}

questPermissionListener.doAllPermissionGrant();

}

}

@Override

protected void onResume() {

super.onResume();

}

public void onResumeCheckPermission(String ...permission){

if(PermisionControl.lackMissPermission(this,permission)){

showMissPermissionDialog();

}

}

@Override

protected void onDestroy() {

super.onDestroy();

ActivityManager.removePermissionActiivty(this);

}

public void showMissPermissionDialog() {

if (builder == null) {

builder = new AlertDialog.Builder(BasePermisitionActivity.this);

builder.setTitle("幫助");

String msg = "目前應用缺少必要權限。

\r請點選\"設定\"-\"權限\"-打開所需權限。

\r\r最後點選兩次後退按鈕,即可傳回。";

builder.setMessage(Html.fromHtml(msg));

//materialDialog.setMovementMethod(LinkMovementMethod.getInstance());

builder.setPositiveButton("設定", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

alertDialog.dismiss();

}

});

builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

alertDialog.dismiss();

startAppSettings();

}

});

alertDialog = builder.create();

alertDialog.show();

} else {

alertDialog.show();

}

}

// 啟動應用的設定

public void startAppSettings() {

try {

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

intent.setData(Uri.parse("package:"+ getPackageName()));

startActivity(intent);

} catch (Exception e) {

e.printStackTrace();

}

}

}

與其相關的工具類:

public class PermisionControl {

public static boolean lackMissPermission(Context cnt ,String... permission){

boolean relust = true ;

for (String per : permission) {

if(ActivityCompat.checkSelfPermission(cnt,per) == PackageManager.PERMISSION_DENIED){

relust = false ;

break;

}

}

return relust;

}

public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){

BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);

}

}

以及其他的一些封裝:

public class PermissionUsage {

public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,

Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE};

public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE};

public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE};

}

以上這篇android6.0運作時權限完美封裝方法就是小編分享給大家的全部内容了,希望能給大家一個參考,也希望大家多多支援腳本之家。