日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 6.0 超级简单的权限申请2 (Permission)

發布時間:2024/1/17 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 6.0 超级简单的权限申请2 (Permission) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼地址如下:
http://www.demodashi.com/demo/13506.html

寫在前面

上次寫了一個權限申請的例子Android 6.0 超級簡單的權限申請 (Permission),原理是封裝權限申請的代碼到一個Helper類,然后重寫onRequestPermissionsResult方法處理。這已經是很簡潔的權限申請方法了,但是還不夠,因為這里還需要重寫onRequestPermissionsResult方法。所以研究了一番,再寫了一個例子,不需要重寫onRequestPermissionsResult方法,真正做到一句代碼搞定權限申請。

實現原理

封裝權限申請的相關代碼到一個Helper類中,在申請權限的時候,啟動一個Fragment,但不顯示,在Fragment中申請權限,也在Fragment中處理權限,最后回調給Helper。

實現過程

  • 封裝PermissionHelper類,定義對外開放的方法
/*** @param permissions e.g. {@link Manifest.permission#CAMERA}* @return true if all granted, false otherwise.*/ public static boolean isGranted(Activity activity, String... permissions)/*** @param grantedListener run on all permission granted* @param deniedListener run if one permission denied*/ public static void requestPermissions(Activity activity, OnPermissionGrantedListener grantedListener, OnPermissionDeniedListener deniedListener, String... permissions)
  • 獲取AndroidManifest中注冊的權限
private static List<String> getRegisteredInManifestPermissions(Activity activity) {List<String> list = new ArrayList<>();try {PackageInfo packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS);String[] permissions = packageInfo.requestedPermissions;if (permissions != null) {list.addAll(Arrays.asList(permissions));}} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}return list; }
  • 檢查權限是否已經注冊
for (String permission : permissions) {if (!mRegisteredInManifestPermissions.contains(permission)) {throw new IllegalArgumentException("the permission \"" + permission + "\" is not registered in AndroidManifest.xml");} }
  • 檢查權限是否已經允許,AndroidM以下的設備直接判斷為允許
public static boolean isGranted(Activity activity, String... permissions) {checkPermissions(activity, permissions);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {for (String permission : permissions) {if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {return false;}}}return true; }
  • 初始化Fragment并添加到Activity中

這里的PermissionHelper直接繼承Fragment了,直接重寫onRequestPermissionsResult處理回調。new Fragment之前先檢查此Activity中是否已經存在一個,如果有則直接使用。

Fragment fragment = activity.getFragmentManager().findFragmentByTag(TAG); if (fragment == null) {fragment = new PermissionHelper();FragmentManager fragmentManager = activity.getFragmentManager();fragmentManager.beginTransaction().add(fragment, TAG).commitAllowingStateLoss();fragmentManager.executePendingTransactions(); }
  • 利用Fragment申請權限
fragment.requestPermissions(permissions, mRequestCode++);
  • 處理onRequestPermissionsResult方法,并把結果正確的回調給用戶
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (mOnGrantedListeners.containsKey(requestCode)) {// 這里規定全部權限都通過才算通過boolean granted = true;// 在Activity A申請權限,然后馬上跳轉到Activity B,則grantResults.length=0if (grantResults.length == 0) granted = false;for (int result : grantResults) {if (result == PackageManager.PERMISSION_DENIED) {granted = false;}}if (granted) {OnPermissionGrantedListener listener = mOnGrantedListeners.get(requestCode);if (listener != null) listener.onGranted();} else {OnPermissionDeniedListener listener = mOnDeniedListeners.get(requestCode);if (listener != null) listener.onDenied();}mOnGrantedListeners.remove(mRequestCode);mOnDeniedListeners.remove(mRequestCode);} }

使用方法

直接在Activity中調用下面代碼既可,雖然很多行,但只是一句代碼哈哈

PermissionHelper.requestPermissions(this, () -> {// on grantedToast.makeText(MainActivity.this, "onGranted", Toast.LENGTH_SHORT).show();}, () -> {// on deniedToast.makeText(MainActivity.this, "onDenied", Toast.LENGTH_SHORT).show();}, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE);

文件結構圖

演示效果圖

運行代碼可能出現的問題

  • compileSdkVersion 27,可以改成你電腦中存在的SDK版本。

  • 這里用的是 gradle-4.4-all.zip,如果你用的是其它版本,那么可能會下載超級慢,建議改成你電腦中存在的gradle版本,改文件PermissionHelper/gradle/wrapper/gradle-wrapper.properties即可。

  • 其它問題可以直接聯系我。
    Android 6.0 超級簡單的權限申請2 (Permission)

代碼地址如下:
http://www.demodashi.com/demo/13506.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權

總結

以上是生活随笔為你收集整理的Android 6.0 超级简单的权限申请2 (Permission)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。