安卓6.0系統逐漸普及,對于安卓6.0中的SDK也有了一些變化,查看具體的詳情請參考官方文檔http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,當然了,運行時權限也是SDK所發生的變化之一,那么本文介紹一下申請動態權限的步驟及簡單的封裝。
對于安卓6.0系統所持有的動態權限,主要是分為兩種:
1.普通權限,也就是說不會影響到用戶的隱私的權限,比如說訪問網絡(大家都知道,幾乎每一個APP都需要有訪問網絡的需求,所以說訪問網絡也是必不可少的),還有就是手 機震動等都是普通權限
2.危險權限,也就是說會影響到用戶隱私的權限,比如說打電話,訪問通訊錄等有關用戶隱私的權限都是屬于危險權限,安卓6.0規定有24中危險權限,如下圖:

1.MainActivity布局文件
<Button android:onClick="but" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="請求打電話權限"/>2.Manifest清單文件中加入權限<uses-permission android:name="android.permission.CALL_PHONE" />3.Activity中的邏輯代碼public void but(View v){//判斷是否已經申請過動態權限了---按鈕的點擊事件中的邏輯代碼/** * 第一個參數為上下文 * 第二個參數為要申請的權限 * */if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){ //沒有申請權限,則去申請權限 /** * 第二個參數為要申請權限的數據 * 第三個參數為表示是在哪一個地方申請的權限,也就是標識 */ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);}else{ //權限申請過了,執行打電話的方法 myPhone(); }}//撥打電話的方法public void myPhone(){ try{ //申請過權限,撥打電話 Intent intent=new Intent(Intent.ACTION_CALL); //指定電話號碼 intent.setData(Uri.parse("tel://13121980161")); startActivity(intent); }catch (SecurityException e){ e.PRintStackTrace(); }}//判斷網絡是否請求成功了---重寫Activity的onRequestPermissionsResult 方法@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { //此處判斷的是上方的標記“1” case 1: //判斷是否申請權限成功 if(grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){ //權限申請成功,執行打電話的方法 myPhone(); Toast.makeText(this, "申請權限成功....", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "申請權限失敗....", Toast.LENGTH_SHORT).show(); } break; default: break; } }四、實際案例Demo-申請多個權限------打電話、訪問sd卡
1.在上一個Demo基礎上再添加一個訪問sd卡的權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />2.Button按鈕中的邏輯
public void but(View view) { //申請多個權限,首先要創建一個集合,添加幾個權限就必須做幾次判斷 //判斷如果申請過的權限就不在添加到集合當中重復申請了 ArrayList<String> permissionList=new ArrayList<>(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){ //添加到集合當中 permissionList.add(Manifest.permission.CALL_PHONE); } if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ //添加到集合當中 permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } //判斷集合是否為空,不為空則請求權限 if(!permissionList.isEmpty()){ ActivityCompat.requestPermissions(this,permissionList.toArray( new String[permissionList.size()]),1); }else{ doSomething();//此方法中就是一個Toast }}3.重寫ActivityonRequestPermissionsResult 方法的邏輯@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { //此處判斷的是上方的標記“1” case 1: //判斷將要申請的權限大于0個,則申請權限 if(grantResults.length>0){ for(int grantResult:grantResults){ if(grantResult!=PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "某一個權限被拒絕了!", Toast.LENGTH_SHORT).show(); return; } } doSomething();//此方法中就是一個Toast } break; default: break; } }五、實際案例Demo-申請運行時權限之3種封裝
1.使用一個透明的Activity,當需要申請危險權限時,則創建此Activity,申請之后就可以銷毀掉。
2.使用RxPermission也可以對運行時權限進行封裝
3.使用一個BaseActivity進行封裝,在這里,就主要提供一下用BaseActivity封裝的方法
public class BaseActivity extends AppCompatActivity { //1.如何讓調用者知道權限是否申請成功 回調 //2.如果不是在Activity中調用,所需的上下文怎么處理 可以通過讓所有的創建的Activity都 // 存到一個集合當中,取其棧頂的Activity作為上下文 private static PermissioLitener mLitener; private static Activity topActivity; public static void requestRuntimePermision(String[] permission, PermissioLitener permissioLitener){ //傳過來的回調監聽 mLitener=permissioLitener; //獲取當前的棧頂Activity topActivity = listActivity.getActivity(); ArrayList<String> list=new ArrayList<>(); for (String per:permission) { //如果當前的這個權限沒有被申請 if(ContextCompat.checkSelfPermission(topActivity,per)!= PackageManager.PERMISSION_GRANTED){ //添加到list集合當中 list.add(per); } } //判斷list集合是否為空,不為空則申請權限 if(!list.isEmpty()){ ActivityCompat.requestPermissions(topActivity,list.toArray(new String[list.size()]),1); }else{ Toast.makeText(topActivity, "所有的權限都已經通過了!", Toast.LENGTH_SHORT).show(); //權限通過的回調方法 mLitener.onGranted(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { //此處判斷的是上方的標記“1” case 1: if(grantResults.length>0){ ArrayList<String> list=new ArrayList<>(); for (int i = 0; i < grantResults.length; i++) { int grantResult=grantResults[i]; String permission=permissions[i]; if(grantResult!=PackageManager.PERMISSION_GRANTED){ list.add(permission); } } //判斷所有的權限是否都通過了 if(!list.isEmpty()){ mLitener.onDenied(list); }else{ mLitener.onGranted(); } } break; default: break; } }}//將所有創建的Activity都存于listActivity中public class listActivity { public static ArrayList<Activity> listActivity=new ArrayList<>(); //添加Activity的方法 public static void addActivity(Activity activity){ listActivity.add(activity); } //銷毀Activity的方法 public static void removeActivity(Activity activity){ listActivity.remove(activity); } //返回Activity的方法 public static Activity getActivity(){ if(listActivity.isEmpty()){ return null; }else{ //防止list集合中的Activity被銷毀,返回棧頂Activity return listActivity.get(listActivity.size()-1); } }}public interface PermissioLitener { //申請的所有權限都通過了所執行的方法 void onGranted(); //申請的權限有的失敗了,將申請失敗的權限放進集合作為參數提示用戶 void onDenied(ArrayList<String> list);}此時在任意一個類中申請權限時是這樣的BaseActivity.requestRuntimePermision(new String[]{Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissioLitener() { @Override public void onGranted() { //所有的權限申請成功 } @Override public void onDenied(ArrayList<String> list) { //權限有的申請失敗了,list中為申請失敗的權限 }});好了,到這里呢,大家是不是對運行時權限有了一定的了解。。。。也挺簡單的事吧,加油!
|
新聞熱點
疑難解答