android6.0運(yùn)行時(shí)權(quán)限完美封裝方法
前幾天看了郭大神的運(yùn)行時(shí)權(quán)限的專講,深受啟發(fā),由于現(xiàn)在基于目前項(xiàng)目中的運(yùn)行時(shí)權(quán)限封裝的還不是那么完美,趁著郭神建議的還是歷歷在目。于是把它完整的敲了下來。并在此基礎(chǔ)上添加上自己的一些見解,封裝成一個(gè)完整的demo,希望與大家進(jìn)行交流與。
在這里我進(jìn)行了簡(jiǎn)單的在activity中簡(jiǎn)單進(jìn)行獲取權(quán)限和工具類封:
某一個(gè)權(quán)限被禁止或者是所有的權(quán)限被禁止,這里我做了去到烯烴界面去設(shè)置的處理:
如果要開啟多個(gè)權(quán)限的話,則可能不同的手機(jī)顯示的效果不同,有些手機(jī)在權(quán)限D(zhuǎn)ialog上顯示需要獲取權(quán)限的個(gè)數(shù),但有些手機(jī)需要多少個(gè)權(quán)限顯示多少個(gè)。
最后一步處理:如果某個(gè)權(quán)限被禁止的話,則到設(shè)置界面去提示用戶去打開權(quán)限:
部分代碼:
/** * 類功能描述:在activity中進(jìn)行檢測(cè)權(quán)限的簡(jiǎn)單方法 </br> * 博客地址:http://blog.csdn.net/androidstarjack * @author 老于 * @version 1.0 </p> 修改時(shí)間:</br> 修改備注:</br> */ 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);//去請(qǐng)求權(quán)限 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<String> neetRequestPermisList = new ArrayList<String>(); 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){//權(quán)限被拒絕啦 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); } /** * 丟失權(quán)限,進(jìn)行彈框設(shè)置 */ public void showMissPermissionDialog() { if (builder == null) { builder = new AlertDialog.Builder(BasePermisitionActivity.this); builder.setTitle("幫助"); String msg = "當(dāng)前應(yīng)用缺少必要權(quán)限。<br>\r請(qǐng)點(diǎn)擊\"設(shè)置\"-\"權(quán)限\"-打開所需權(quán)限。<br>\r\r最后點(diǎn)擊兩次后退按鈕,即可返回。"; builder.setMessage(Html.fromHtml(msg)); //materialDialog.setMovementMethod(LinkMovementMethod.getInstance()); builder.setPositiveButton("設(shè)置", 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(); } } // 啟動(dòng)應(yīng)用的設(shè)置 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(); } } }
與其相關(guān)的工具類:
/** * 類功能描述:6.0運(yùn)行時(shí)權(quán)限 </br> * permission權(quán)限控制器</br> * 博客地址:http://blog.csdn.net/androidstarjack * @author 老于 * Created on 2017/1/3/002 * @version 1.0 </p> 修改時(shí)間:</br> 修改備注:</br> */ public class PermisionControl { /** * 檢查所有的權(quán)限是否被禁止 */ 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; } /** * 請(qǐng)求運(yùn)行時(shí)權(quán)限 * eg: */ public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){ BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener); } }
以及其他的一些封裝:
public class PermissionUsage { /**********權(quán)限:打電話,寫入內(nèi)存卡,定位********/ public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE}; /**********權(quán)限:讀取內(nèi)存卡********/ public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE}; /**********權(quán)限:打電話權(quán)限********/ public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE}; }
以上這篇android6.0運(yùn)行時(shí)權(quán)限完美封裝方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android PraiseTextView實(shí)現(xiàn)朋友圈點(diǎn)贊功能
這篇文章主要為大家詳細(xì)介紹了PraiseTextView簡(jiǎn)單實(shí)現(xiàn)朋友圈點(diǎn)贊功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android中實(shí)現(xiàn)布局背景模糊化處理的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)布局背景模糊化處理的方法,需要的朋友可以參考下2015-04-04Android實(shí)戰(zhàn)教程第五篇之一鍵鎖屏應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)教程第五篇之一鍵鎖屏應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11使用Eclipse配置android開發(fā)環(huán)境教程
這篇文章主要介紹了使用Eclipse配置android開發(fā)環(huán)境教程,本文講解了下載需要用到的工具、下載完需要的工具之后開始安裝、讓Ecplise自動(dòng)安裝Android開發(fā)插件(ADT- plugin)、配置Andiord SDK路徑、測(cè)試開發(fā)一個(gè)Android項(xiàng)目等內(nèi)容,需要的朋友可以參考下2015-04-04Android調(diào)用系統(tǒng)時(shí)間格式顯示時(shí)間信息
這篇文章主要介紹了Android調(diào)用系統(tǒng)時(shí)間格式顯示時(shí)間信息的使用方法,代碼很簡(jiǎn)單2014-01-01Android基于ViewPager實(shí)現(xiàn)類似微信頁面切換效果
這篇文章主要介紹了Android基于ViewPager實(shí)現(xiàn)類似微信頁面切換效果,通過Fragment適配器實(shí)現(xiàn)頁面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Kotlin中ListView與RecyclerView的應(yīng)用講解
這篇文章主要介紹了Kotlin中ListView與RecyclerView的應(yīng)用講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09