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-01
Android中實(shí)現(xiàn)布局背景模糊化處理的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)布局背景模糊化處理的方法,需要的朋友可以參考下2015-04-04
Android實(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-04
Android調(diào)用系統(tǒng)時(shí)間格式顯示時(shí)間信息
這篇文章主要介紹了Android調(diào)用系統(tǒng)時(shí)間格式顯示時(shí)間信息的使用方法,代碼很簡(jiǎn)單2014-01-01
Android基于ViewPager實(shí)現(xiàn)類似微信頁(yè)面切換效果
這篇文章主要介紹了Android基于ViewPager實(shí)現(xiàn)類似微信頁(yè)面切換效果,通過Fragment適配器實(shí)現(xiàn)頁(yè)面切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android中Glide庫(kù)的使用小技巧總結(jié)
Glide是 Google推薦的圖片加載庫(kù),相信大家都不陌生,這篇文章主要給大家總結(jié)介紹了關(guān)于Android中Glide庫(kù)的使用小技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Kotlin中ListView與RecyclerView的應(yīng)用講解
這篇文章主要介紹了Kotlin中ListView與RecyclerView的應(yīng)用講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

