精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android 7.0動態權限大總結

移動開發 Android
應公司項目需求,做了下Android 7.0適配。對于我們程序員,適配7.0主要就是對手機本地文件的Uri做轉換處理。注意紅色字體,意思也就是說對于http開頭的等等,非手機存儲中的文件就不用管了。

應公司項目需求,做了下Android 7.0適配。對于我們程序員,適配7.0主要就是對手機本地文件的Uri做轉換處理。注意紅色字體,意思也就是說對于http開頭的等等,非手機存儲中的文件就不用管了。Uri.parse(“package”) 這樣的也不用管!!!!!

7.0的適配,就是對手機存儲中的私有文件路徑的保護,當系統發現你通過intent帶走了一個uri,地址是本地的文件,就會限制的。其他的原理普及請搜索其他文章吧,此處略。

下面貼一下使用步驟和我的工具類。

一、需要修改當前module的AndroidManifest.xml文件,添加provider標簽,映射路徑。

  1. <android:supportsRtl="true"
  2.   
  3. <provider 
  4.      android:name="android.support.v4.content.FileProvider" 
  5.      android:authorities="${applicationId}.myFileProvider" 
  6.      android:exported="false" 
  7.      android:grantUriPermissions="true"
  8.      <meta-data 
  9.           android:name="android.support.FILE_PROVIDER_PATHS" 
  10.           android:resource="@xml/path_file" />  

文中紅色部分是固定寫法,官網就是這么說的,別亂試了。android:resource標簽的值是main/res/xml/path_file.xml文件,即在 res下新建xml文件夾,再新建一個xml文件。

二、在res/xml下新建一個path_file.xml文件,文件名隨便去,但是與上步驟一致即可。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.   <paths> 
  4.     <!-- 
  5.     <files-path/>代表的根目錄: Context.getFilesDir() 
  6.     <cache-path/>代表的根目錄: getCacheDir() 
  7.     <external-path/>代表的根目錄: Environment.getExternalStorageDirectory() 
  8.     <external-files-path/>代表的根目錄: Context.getExternalFilesDir(String) Context.getExternalFilesDir(null). 
  9.     <external-cache-path />代表的根目錄: Context.getExternalCacheDir(). 
  10.     <root-path />代表設備的根目錄new File("/"); 
  11.     --> 
  12.     <!-- path=""代表根目錄,也可以指定特定目錄,name="camera_picture"是虛擬目錄camera_picture --> 
  13.     <root-path name="root" path="" /> 
  14.     <files-path name="files" path="" /> 
  15.     <cache-path name="cache" path="" /> 
  16.     <external-path name="external" path="" /> 
  17.     <external-files-path name="external_files" path="" /> 
  18.     <external-cache-path name="external_cache" path="" /> 
  19.   </paths> 
  20. </resources>  

里面共有6個path標簽,含義都寫了,根據你的需要些對應的標簽即可。比喻<external-path/>標簽,里面的path=”"時,這個標簽映射的就是外掛sd卡根目錄了,name屬性沒什么用,來迷惑第三方應用的虛擬目錄,來掩蓋文件的真實路徑。

三、工具類來了。

FileUriPermissionCompat.Java

  1. /** 
  2.  * @Author: duke 
  3.  * @DateTime: 2017-06-06 14:43 
  4.  * @Description: android 7.0 uri權限適配, 
  5.  * (通過intent暴漏uri或file給第三方app時的)私有目錄被禁止訪問 
  6.  * 已對local path和net path做了適配 
  7.  */ 
  8. public class FileUriPermissionCompat { 
  9.    private static final String TAG = FileUriPermissionCompat.class.getSimpleName(); 
  10.   
  11.    // TODO: 此處需要更改為對應值 
  12. //此處需要改成AndroidManifest.xml中申請的對應的provider的authorities值 
  13.    private static final String AUTHORITIES = "com.duke.personalkeeper.myFileProvider"
  14.   
  15.    /** 
  16.     * 是否需要適配7.0權限 
  17.     * 
  18.     * @return 
  19.     */ 
  20.    public static boolean isNeedAdapt() { 
  21. //24以上版本 
  22.       return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N; 
  23.    } 
  24.   
  25.    public static Uri adaptUriAndGrantPermission(Context context, Intent intent, File file) { 
  26.       Uri uri = adaptUri(context, file); 
  27.       if (uri == null) { 
  28.          return null
  29.       } 
  30.       grantUriPermission(context, intent, uri); 
  31.       return uri; 
  32.    } 
  33.   
  34.    public static Uri adaptUri(Context context, File file) { 
  35.       if (context == null || file == null) { 
  36.          return null
  37.       } 
  38. //網絡路徑的特殊處理,不需要7.0適配,但必須用parse()方法 
  39.       if (file.getPath().startsWith("http")) { 
  40.          return Uri.parse(file.getPath()); 
  41.       } 
  42.       Uri uri = null
  43.       try { 
  44.          if (isNeedAdapt()) { 
  45. //需要7.0特殊適配 
  46. //通過系統提供的FileProvider類創建一個content類型的Uri對象 
  47.             uri = FileProvider.getUriForFile(context, AUTHORITIES, file); 
  48.          } else { 
  49. //不需要適配 
  50.             uri = Uri.fromFile(file); 
  51.          } 
  52.       } catch (Exception e) { 
  53.          Log.e(TAG, "authorities value error, so can't convert uri !"); 
  54.          e.printStackTrace(); 
  55.       } 
  56.       return uri; 
  57.    } 
  58.   
  59.    /** 
  60.     * 對第三方應用賦予對uri讀寫的權限 
  61.     * 
  62.     * @param context 
  63.     * @param intent 
  64.     * @param saveUri 適配后的uri 
  65.     */ 
  66.    public static void grantUriPermission(Context context, Intent intent, Uri saveUri) { 
  67.       if (!isNeedAdapt()) { 
  68.          return
  69.       } 
  70.       if (context == null || intent == null || saveUri == null) { 
  71.          return
  72.       } 
  73. //網絡路徑的特殊處理,不需要權限 
  74.       if (saveUri.getScheme() != null && saveUri.getScheme().startsWith("http")) { 
  75. //不需要授權 
  76.          return
  77.       } 
  78. //1、授權(系統相冊、相機、裁剪時需要)  -- 這種寫法待分析 
  79.       List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
  80.       for (ResolveInfo resolveInfo : resInfoList) { 
  81.          String packageName = resolveInfo.activityInfo.packageName; 
  82.          if (TextUtils.isEmpty(packageName)) { 
  83.             continue
  84.          } 
  85.          context.grantUriPermission(packageName, saveUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
  86.       } 
  87. //2、授權(安裝apk時需要) 
  88.       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
  89.    } 
  90.   
  91.    public static void revokeUriPermission(Context context, Intent intent, Uri saveUri) { 
  92.       if (!isNeedAdapt()) { 
  93.          return
  94.       } 
  95.       if (context == null || intent == null || saveUri == null) { 
  96.          return
  97.       } 
  98. //網絡路徑的特殊處理,不需要權限 
  99.       if (saveUri.getScheme() != null && saveUri.getScheme().startsWith("http")) { 
  100. //不需要授權 
  101.          return
  102.       } 
  103.       try { 
  104.          context.revokeUriPermission(saveUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
  105.       } catch (Exception e) { 
  106.          e.printStackTrace(); 
  107.       } 
  108.    } 
  109.  

核心代碼:

  1. uri = FileProvider.getUriForFile(context, AUTHORITIES, file); 

file就是你想要暴露給其他應用的文件地址,比喻你要拍照,把結果保存到file文件中。

AUTHORITIES就是上面第一步中,android:authorities=”${applicationId}.myFileProvider”的實際值, ${applicationId}取得是app/build.gradle中defaultConfig標簽的applicationid值。通過系統提供的FileProvider類的靜態方法轉換file地址為一個以content://開頭的特殊的uri。如果不轉換的話,直接用Uri.fromFile(file),你得到的是一個file:///xxxxx這樣的uri。就這差別。

轉換了uri之后,還需要授權:

  1. /** 
  2.     * 對第三方應用賦予對uri讀寫的權限 
  3.     * 
  4.     * @param context 
  5.     * @param intent 
  6.     * @param saveUri 適配后的uri 
  7.     */ 
  8.    public static void grantUriPermission(Context context, Intent intent, Uri saveUri) { 
  9.       if (!isNeedAdapt()) { 
  10.          return
  11.       } 
  12.       if (context == null || intent == null || saveUri == null) { 
  13.          return
  14.       } 
  15. //網絡路徑的特殊處理,不需要權限 
  16.       if (saveUri.getScheme() != null && saveUri.getScheme().startsWith("http")) { 
  17. //不需要授權 
  18.          return
  19.       } 
  20. //1、授權(系統相冊、相機、裁剪時需要)  -- 這種寫法待分析 
  21.       List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
  22.       for (ResolveInfo resolveInfo : resInfoList) { 
  23.          String packageName = resolveInfo.activityInfo.packageName; 
  24.          if (TextUtils.isEmpty(packageName)) { 
  25.             continue
  26.          } 
  27.          context.grantUriPermission(packageName, saveUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
  28.       } 
  29. //2、授權(安裝apk時需要) 
  30.       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
  31.    }  

里面有兩部分授權方式,經過多輪測試,發現需要同時使用比較好。

第一種方式,for循環,是因為有時候你并不確定需要分享的應用的包名是哪一個,所以找到所有有可能的第三方應用,全部授權了。

后來測試發現,安裝apk的時候,只有上面的授權是不行的,還得加上intent.addFlag的方式再次授權才行。

最后,需要注意的是:

1、注意7.0的版本判斷。

2、切記,7.0的權限有可能需要對sd卡讀寫,需要6.0的讀寫sd卡權限。當你測試7.0權限不成功時,考慮下6.0的權限是否到位了。

其他的沒的說了。就這些。 

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2010-03-03 17:02:08

Android手機

2010-02-04 17:16:30

2011-04-14 09:28:56

IIS 7.0

2020-11-02 00:17:52

vSphere 7.0Kubernetes容器管理

2016-08-29 20:46:09

Android 7.0牛軋糖Android 7.0

2025-08-01 09:03:06

Spring重試機制網絡

2012-10-09 10:26:52

Linux目錄權限

2019-11-25 08:00:00

微軟PowerShellPowerShell

2010-05-18 15:54:25

IIS 7.0

2022-06-16 10:38:24

URL權限源代碼

2010-05-27 12:58:16

MySQL性能測試

2010-03-24 18:59:29

2024-01-08 09:43:20

2015-11-16 10:34:19

Linux動態庫總結

2011-03-10 15:34:21

網絡管理

2010-02-02 09:08:39

Python 特性

2017-01-03 15:46:13

AndroidAndroid7.0

2010-05-13 18:01:36

IIS服務器

2009-11-11 14:27:32

ADO.NET函數

2016-08-29 14:18:48

Testin
點贊
收藏

51CTO技術棧公眾號

免费高清完整在线观看| 中文字幕在线2021| 欧美电影网站| 国产亚洲午夜高清国产拍精品 | 99thz桃花论族在线播放| 91视频在线看| 国产精品人成电影在线观看| 一级性生活免费视频| 91麻豆精品国产91久久久久推荐资源| 欧美日韩日本国产| 影音先锋亚洲视频| 天堂网av在线播放| 麻豆精品国产传媒mv男同| 久久99精品久久久久久噜噜| 免费看污黄网站在线观看| 欧美高清你懂的| 亚洲免费伊人电影| 欧美在线视频一区二区三区| 精品国产一级片| 久久久国产精品一区二区中文| 日韩一区二区久久久| 一本加勒比波多野结衣| 亚洲在线资源| 91国偷自产一区二区三区观看| 中文字幕の友人北条麻妃| 美丽的姑娘在线观看免费动漫| 国内精品国产成人| 国产成一区二区| 国产精品19乱码一区二区三区| 欧美先锋资源| 亚洲国产精品va在线看黑人| 中文字幕第17页| 午夜欧美激情| 亚洲国产视频一区| 久久最新免费视频| 成人免费在线电影| 久久亚洲精品小早川怜子| 91福利入口| 国产精品久久久久久久久毛片| 亚洲欧美日韩精品一区二区 | 少妇无套高潮一二三区| 琪琪久久久久日韩精品| 日韩免费观看高清完整版在线观看| 香蕉视频网站入口| 粉嫩一区二区三区| 色av一区二区| 久久久久免费精品| 不卡福利视频| 福利视频一区二区| 国产美女无遮挡网站| 欧美黑人xx片| 亚洲国产一区视频| 欧美高清中文字幕| 久草在线视频福利| 夜夜嗨av一区二区三区| 日韩人妻一区二区三区蜜桃视频| 久操视频在线播放| 1000部国产精品成人观看| 亚洲电影一二三区| av在线电影免费观看| 日本一区二区在线不卡| 日韩一区二区三区资源| 国产二区在线播放| 欧美激情中文不卡| 亚洲精品一区二区三区蜜桃久| 国产黄在线看| 国产欧美精品一区| 在线观看免费91| www.在线视频| 亚洲一区影音先锋| 男人的天堂狠狠干| 欧美日韩电影免费看| 日本道色综合久久| 色噜噜狠狠永久免费| 精品国产一区二区三区四区精华| 国产夫妻性爱视频| 日韩系列在线| 亚洲精品一区二区久| 亚洲欧美va天堂人熟伦| 欧美r级电影| 不卡伊人av在线播放| 久久精品99国产精| 久久电影一区| 91精品国产综合久久男男| 国产三级小视频| 成人av网在线| 青青草成人激情在线| 免费在线看黄| 午夜视频久久久久久| 久久综合久久色| 亚洲欧美一级| 亚洲第一二三四五区| 国产av自拍一区| 久久五月天小说| 久久久久成人网| 天堂网免费视频| 国产一区在线观看视频| 精品视频在线观看| 日本在线人成| 天天色图综合网| 日韩欧美国产片| 国产精品2023| 最近2019年好看中文字幕视频| 久久精品视频免费在线观看| 午夜在线播放视频欧美| 成人精品久久久| 欧美孕妇孕交| 一区二区在线观看免费视频播放| 丰满人妻中伦妇伦精品app| 亚洲a成人v| 日韩麻豆第一页| 国产一区二区精彩视频| 香蕉成人久久| 99九九电视剧免费观看| 酒色婷婷桃色成人免费av网| 亚洲综合丝袜美腿| 国产三级国产精品国产专区50| 精品素人av| 正在播放欧美一区| 欧美日韩乱国产| 国产精品77777| 亚洲人成77777| 新版的欧美在线视频| 日韩一卡二卡三卡四卡| 又色又爽的视频| 久久久久看片| 久久国产精品-国产精品| av毛片在线| 欧美亚洲综合久久| 国产偷人妻精品一区| 影音先锋久久久| 亚洲精品日韩激情在线电影| yw在线观看| 色综合婷婷久久| 国产情侣久久久久aⅴ免费| 亚洲啊v在线观看| 国产精品免费电影| 裸体xxxx视频在线| 福利微拍一区二区| 日本黄色录像片| 今天的高清视频免费播放成人| 91久久精品国产91性色| 日本韩国在线视频爽| 欧美三片在线视频观看| 性欧美一区二区| 久久国产精品99国产| 久久av一区二区三区亚洲| 欧美1234区| 日韩免费一区二区| 久久久国产精华液| 丁香六月久久综合狠狠色| 欧美另类videosbestsex日本| 国产精品麻豆| 久久成人精品一区二区三区| av中文字幕免费| 一区二区免费视频| 香蕉在线观看视频| 亚洲国产日韩欧美一区二区三区| 国产chinese精品一区二区| 好看的中文字幕在线播放| 精品日韩99亚洲| 国产一级二级三级| 不卡一区二区在线| 欧美综合在线播放| 五月天亚洲一区| 国产成人精品电影| 91视频在线观看| 欧美一级二级在线观看| 国产在线观看免费av| a级精品国产片在线观看| 欧美老熟妇喷水| 欧美美女在线| 成人h视频在线观看播放| 一色桃子av在线| 亚洲国产精品国自产拍av秋霞| 亚洲影院在线播放| 亚洲国产精品av| 国产不卡一区二区在线播放| 午夜在线视频免费观看| 中文字幕色婷婷在线视频 | 99产精品成人啪免费网站| 亚洲欧美中日韩| 伊人久久久久久久久| 亚洲视频大全| 亚洲欧洲精品在线| 在线视频亚洲欧美中文| 7777kkkk成人观看| a视频网址在线观看| 欧美www视频| 久久精品无码av| 综合av第一页| 四季av综合网站| 美女脱光内衣内裤视频久久影院| 97超碰人人爱| 亚洲成人一品| 亚洲综合av影视| 中文字幕在线高清| 久久视频免费在线播放| 天堂av资源在线| 69精品人人人人| 成人免费区一区二区三区| 中文字幕在线不卡视频| 黄色录像a级片| 久草在线在线精品观看| heyzo亚洲| 国产精品久久久久9999赢消| 精品视频一区在线| 天堂精品久久久久| 国产精品视频区| 日韩深夜视频| 久久99久久99精品免观看粉嫩| 九九热视频在线观看| 欧美变态凌虐bdsm| 亚洲一区二区激情| 欧美视频专区一二在线观看| 加勒比婷婷色综合久久| 久久久噜噜噜久噜久久综合| 黑人无套内谢中国美女| 蜜臀av性久久久久蜜臀av麻豆 | 久久亚洲风情| 久久成人福利视频| 91视频精品| 欧美一区二区在线| 久久a爱视频| 91精品国自产在线观看| 欧美一级做一级爱a做片性| 日本高清视频一区| 999av小视频在线| 欧美黑人巨大xxx极品| 欧美成人三区| 中文字幕不卡av| 久久天堂电影| 日韩成人av一区| 人成网站在线观看| 日韩欧美一二区| 97国产精品久久久| 在线观看区一区二| 欧美超碰在线观看| 999久久久91| 亚洲欧洲av色图| 国产又粗又猛又色| 成人黄页在线观看| 香蕉久久久久久av成人| 国产乱码精品一区二区三区五月婷| 在线观看av网页| 久久婷婷亚洲| 欧美激情精品久久久久久小说| 欧美专区一区二区三区| 亚洲国产精品久久久久爰色欲| 国产污污视频在线观看 | 国产日本在线视频| 亚洲精品福利在线| 四虎精品一区二区三区| 亚洲成人在线视频播放| 成人免费公开视频| 精品福利一区二区三区免费视频| 超碰福利在线观看| 欧美xingq一区二区| 亚洲国产一二三区| 亚洲精品一线二线三线无人区| 亚洲国产精品久久久久久久| 精品成人一区二区三区四区| 高潮一区二区三区乱码| 亚洲福利影片在线| 欧美少妇另类| 在线视频欧美性高潮| 香蕉视频免费在线播放| 久久久国产视频| 青草在线视频在线观看| 97精品久久久中文字幕免费| 澳门成人av网| 国产乱人伦真实精品视频| 精品国产乱码一区二区三区| 国产精品毛片一区视频| 日韩mv欧美mv国产网站| 日韩欧美一区二区在线观看| 999久久久国产精品| www.亚洲视频.com| 欧美亚洲一区二区三区| 久久撸在线视频| 国产成人综合自拍| 亚洲成人日韩在线| 国产精品精品国产色婷婷| 九九热精彩视频| 欧美午夜www高清视频| 亚洲一卡二卡在线| 亚洲国产成人精品女人久久久| 欧美少妇另类| 欧美成人性生活| 成人av观看| 成人午夜小视频| 日韩高清电影免费| 大桥未久一区二区三区| 亚洲在线国产日韩欧美| 亚洲一区二区三区四区五区| 成人一级片网址| 内射毛片内射国产夫妻| 亚洲高清三级视频| а中文在线天堂| 精品久久久久久无| eeuss影院在线播放| 高清亚洲成在人网站天堂| 国产麻豆久久| 国产女主播一区二区三区| 色喇叭免费久久综合| 日韩精品在线观看av| 美女尤物国产一区| 熟妇高潮精品一区二区三区| 亚洲欧洲国产日韩| 亚洲av中文无码乱人伦在线视色| 欧美片网站yy| 理论视频在线| 久久久伊人日本| 99精品国产九九国产精品| 久久久亚洲综合网站| 中文字幕免费精品| 国产一伦一伦一伦| 久久久久久麻豆| 国产在线精品观看| 51精品国自产在线| 成人一区二区不卡免费| 国产69精品久久久| 国产一区二区av在线| 亚洲v国产v在线观看| 国产农村妇女毛片精品久久莱园子 | 欧美日韩一区二区三区四区五区六区| 最近中文字幕免费mv2018在线| 欧美在线你懂的| 欧美视频一二区| 久久精品色欧美aⅴ一区二区| 欧美专区福利免费| 国产精品一区二区免费看| 亚洲老妇激情| 91精品999| 中文字幕第一区二区| 久久久久久不卡| 日韩精品在线免费观看| 超碰97免费在线| 3d动漫啪啪精品一区二区免费| 91欧美国产| 亚洲欧美日韩三级| 国产精品成人午夜| 中文字幕在线视频第一页| 国产亚洲精品久久久久久牛牛| 秋霞伦理一区| 六月婷婷久久| 亚洲欧美日韩专区| xxxx日本免费| 欧洲一区二区三区在线| 黄色网址在线播放| 国产精品久久一区主播| 成人无号精品一区二区三区| 99视频在线免费| 中文字幕第一区综合| 在线免费观看高清视频| 色综合伊人色综合网| 日韩美女在线| 亚欧洲精品在线视频免费观看| 青青草国产精品97视觉盛宴| 精品无码人妻一区二区免费蜜桃| 91久久免费观看| 69久久夜色| 亚洲www永久成人夜色| 欧美色综合网| 女同性恋一区二区三区| 欧美日韩精品在线| 毛片在线播放网站| 国产日韩精品综合网站| 真实国产乱子伦精品一区二区三区| 色欲无码人妻久久精品| 亚洲高清久久久| 欧美少妇另类| 国产精品自在线| 综合激情在线| 中国极品少妇videossexhd| 色综合色狠狠天天综合色| 超碰在线国产| 亚洲自拍在线观看| 在线综合视频| 日本一二三不卡视频| 日韩三级.com| 亚洲欧洲美洲av| 在线观看亚洲视频啊啊啊啊| 国产成都精品91一区二区三| www.国产一区二区| 日韩一区视频在线| 嗯用力啊快一点好舒服小柔久久| 欧美aⅴ在线观看| 最近中文字幕一区二区三区| 刘亦菲久久免费一区二区| 国产黑人绿帽在线第一区| 亚洲精品888| 女~淫辱の触手3d动漫| 88在线观看91蜜桃国自产| 午夜伦理福利在线| 日本天堂免费a| 国产视频一区二区三区在线观看| 国产女人高潮毛片| 国产成人av在线播放| 欧美福利专区|