电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android 版本、權限適配相關總結

瀏覽:5日期:2022-09-18 15:57:57
目錄請求存儲權限版本適配Android 7.0 前Android 7.0 后Android 10.0什么是作用域舉個栗子請求存儲權限

首先需要在 AndroidManifest.xml 文件中聲明權限:

<uses-permission android:name='android.permission.READ_EXTERNAL_STORAGE' />

在代碼中請求用戶權限:

// 權限請求碼 private static final int PERMISSION_REQ_ID = 0; // 請求權限 private static final String[] REQUESTED_PERMISSIONS = { Manifest.permission.READ_EXTERNAL_STORAGE }; ... // 判斷有沒有存儲權限 if (checkSelfPermission(REQUESTED_PERMISSIONS[0],PERMISSION_REQ_ID)){//YSE }else {//NO } private boolean checkSelfPermission(String permissions,int requestCode){if (ContextCompat.checkSelfPermission(this,permissions) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, requestCode); return false;}return true; } // 重寫此方法,接收用戶授權回調 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {Log.i(TAG, 'onRequestPermissionsResult: requestCode =' + requestCode+'n,permissions =' + Arrays.toString(permissions)+'n,grantResults =' + Arrays.toString(grantResults));if (requestCode == PERMISSION_REQ_ID){ if (grantResults[0] == PackageManager.PERMISSION_GRANTED){//用戶同意權限 }else {//用戶拒絕權限 }} 版本適配

從 Android 6.0 到 Android 10 存儲/訪問文件功能,有發生了很多變化。

Android 7.0 前

在Android 7.0 以前我們訪問內存中的文件可以通過 Uri.fromFile,將 File 轉換成 Uri 對象,這個 Uri 對象表示這本地真實路徑。 訪問一個圖片:

String fileName = 'default_Image.jpg';File file = new File('file_path', fileName);Uri uri = Uri.fromFile(file);Android 7.0 后

在 7.0 后,這種通過真實路徑來獲取的 Uri 被認為是不安全的,所以提供了一種新的解決方案,就是通過 FileProvide 來實現文件的訪問,FileProvider 是一種比較特殊的內容提供器,他使用了類似于內容提供器的機制來對數據進行保護。 訪問一個圖片:

File file = new File(CACHE_IMG, 'file_name'); Uri imageUri = FileProvider.getUriForFile(activity,'com.sandan.fileprovider', file); //這里進行替換uri的獲得方式

然而上面這種真的好嗎,對用開發者而且這算是好處吧,但是對用用戶而言,上述的無疑一些流氓作用,因為開發者完全可以訪問的內存中的所有位置,并作出一些改變,導致 SD 卡中的空間變得非常亂,即使卸載了 app,但是一些垃圾文件卻還在內存中。

Android 10.0

在 Android 10.0 ,為了解決上述問題,Google 在 Android 10.0 中加入了 作用域功能。

什么是作用域

就是 Android 系統對 SD 卡做了很大的限制,從 Android 10.0 開始,每個程序只能有權在自己的外置存儲空間關聯的目錄下讀取和創建相應的文件,也稱作沙箱。獲取該目錄的代碼是:getExternalFilesDir() ,關聯的目錄路徑大致如下:

Html CSS JavaScript Vb vbs Asp PHP Perl Python Ruby C# C++ SQL Delphi Diff Groovy Java JavaFX ActionScript3 Bash/shell powershell Plain Text Scala XML顯示語言名稱 顯示行號 允許折疊

將數據放在這個目錄下,你可以使用之前的方法對文件進行讀寫,不需要作出任何變更和適配。但是這個文件夾中的文件會隨著應用卸載而被隨之刪除。 那如果需要訪問其他目錄怎么辦呢?比如獲取相冊中的圖片,向相冊中添加一張圖片。為此,Android 系統針對系統文件類型進行了分類:圖片,音頻,視頻 這三類文件可以通過 MediaStore API 來進行訪問,這種稱為共享空間,其他的系統文件需要使用 系統的文件選擇器來進行訪問,另外,如果程序向媒體庫寫入圖片,視頻,音頻,將會自動用于讀寫權限,不需要額外申請權限,如果你要讀取其他程序向媒體貢獻的圖片,視頻,音頻,則必須要申請 READ_EXTERNAL_STORAGE 權限,WRITE_EXTERNAL_STORAGE 權限會在未來的版本中被廢棄。

舉個栗子

舉例說明:有一張本地圖片,向這張圖片添加水印,并保存到相冊。

直接上代碼:

/** * 保存圖片到相冊 * * @param context 上下文 * @param text 水印文字 */ private void savePhotoAlbum(final Context context, final String text) {//這里開啟子線程,防止堵塞。new Thread(new Runnable() { @Override public void run() {try { //從本地獲取一張圖片,轉成Bitmap Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_info); //在沙箱中創建文件,名稱:info.jpg File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), 'info.jpg'); //判斷文件是否存在,不存在創建文件。 if (!file.exists()) {file.createNewFile(); } // 向圖片添加水印 Bitmap newBitmap = addInfoWatermark(context, bitmap, text); // 更新相冊 updatePhotoAlbum(context, newBitmap, file);} catch (Exception e) { e.printStackTrace();} }}).start(); //開始線程 } /** * 保存到相冊 * * @param context 上下文 * @param src 源圖片 * @param text 水印文字 */ private Bitmap addInfoWatermark(final Context context, Bitmap src, String text) {//判斷圖片/水印文字 是否為空if (isEmptyBitmap(src) || text == null ) { return null;}// 從源圖片復制一份Bitmap ret = src.copy(src.getConfig(), true);// 初始化畫筆Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 初始化畫布Canvas canvas = new Canvas(ret);// 水印文字:黑色paint.setColor(Color.BLACK);// 文字大小:19dppaint.setTextSize(dip2px(context, 19)); // 開始繪畫canvas.drawText(text, 10, 10 , paint);// 循環利用資源if (!src.isRecycled()) { src.recycle(); }return ret; } /** * 保存到相冊 * * @param context 上下文 * @param src 源圖片 * @param file 要保存到的文件 */ private void savePhotoAlbum(final Context context, Bitmap src, final File file) {//判斷圖片 是否為空if (isEmptyBitmap(src)) { return;}// 保存文件OutputStream outputStream;try { //輸出這個文件 outputStream = new BufferedOutputStream(new FileOutputStream(file)); // 壓縮 src.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); // 循環利用資源 if (!src.isRecycled()) {src.recycle(); }} catch (FileNotFoundException e) { e.printStackTrace();}// 更新圖庫,這個在 Android 6.0 和 Android 10.0 更新圖庫,存在差異。if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Android 10.0 及以上 // 創建 ContentValues 對象,準備插入數據 ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName()); values.put(MediaStore.MediaColumns.MIME_TYPE, getMimeType(file)); values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM); ContentResolver contentResolver = context.getContentResolver(); // 插入數據,返回所插入數據對應的Uri Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (uri == null) {return; } try {// 獲取剛插入的數據的Uri對應的輸出流outputStream = contentResolver.openOutputStream(uri);FileInputStream fileInputStream = new FileInputStream(file);// 從一個流復制到另一個流上FileUtils.copy(fileInputStream, outputStream);//關閉流fileInputStream.close();outputStream.close(); } catch (IOException e) {e.printStackTrace(); }} else { // android 6.0 - 10.0 // 掃描文件 MediaScannerConnection.scanFile( context.getApplicationContext(), new String[]{file.getAbsolutePath()}, new String[]{'image/jpeg'}, new MediaScannerConnection.OnScanCompletedListener() {@Overridepublic void onScanCompleted(String path, Uri uri) { //通知相冊更新 // 插入圖片 MediaStore.Images.Media.insertImage( context.getContentResolver(), BitmapFactory.decodeFile(path), file.getName(), null); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri u = Uri.fromFile(file); intent.setData(u); context.sendBroadcast(intent); // 發廣播通知,更新相冊} });} } /** * Bitmap對象是否為空。 */ private static boolean isEmptyBitmap(Bitmap src) {return src == null || src.getWidth() == 0 || src.getHeight() == 0; } /** * 獲取 Mime 類型 * * @param file 文件 * @return Mime 類型 */ private static String getMimeType(File file) {FileNameMap fileNameMap = URLConnection.getFileNameMap();String type = fileNameMap.getContentTypeFor(file.getName());return type; } /** * 根據手機的分辨率從 px(像素) 的單位 轉成為 dp */ public int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f); }

以上就是Android 版本、權限適配相關總結的詳細內容,更多關于Android 版本、權限適配的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 番茄畅听邀请码怎么输入 - Dianw8.com | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 联系我们-腾龙公司上分客服微信19116098882 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 楼承板-开闭口楼承板-无锡海逵楼承板| 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 高博医疗集团上海阿特蒙医院 | OpenI 启智 新一代人工智能开源开放平台 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 精准猎取科技资讯,高效阅读科技新闻_科技猎 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 |