日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android 版本、權(quán)限適配相關(guān)總結(jié)

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

首先需要在 AndroidManifest.xml 文件中聲明權(quán)限:

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

在代碼中請求用戶權(quán)限:

// 權(quán)限請求碼 private static final int PERMISSION_REQ_ID = 0; // 請求權(quán)限 private static final String[] REQUESTED_PERMISSIONS = { Manifest.permission.READ_EXTERNAL_STORAGE }; ... // 判斷有沒有存儲權(quán)限 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; } // 重寫此方法,接收用戶授權(quán)回調(diào) @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){//用戶同意權(quán)限 }else {//用戶拒絕權(quán)限 }} 版本適配

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

Android 7.0 前

在Android 7.0 以前我們訪問內(nèi)存中的文件可以通過 Uri.fromFile,將 File 轉(zhuǎn)換成 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 來實現(xiàn)文件的訪問,F(xiàn)ileProvider 是一種比較特殊的內(nèi)容提供器,他使用了類似于內(nèi)容提供器的機制來對數(shù)據(jù)進行保護。 訪問一個圖片:

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

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

Android 10.0

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

什么是作用域

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

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顯示語言名稱 顯示行號 允許折疊

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

舉個栗子

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

直接上代碼:

/** * 保存圖片到相冊 * * @param context 上下文 * @param text 水印文字 */ private void savePhotoAlbum(final Context context, final String text) {//這里開啟子線程,防止堵塞。new Thread(new Runnable() { @Override public void run() {try { //從本地獲取一張圖片,轉(zhuǎn)成Bitmap Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_info); //在沙箱中創(chuàng)建文件,名稱:info.jpg File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), 'info.jpg'); //判斷文件是否存在,不存在創(chuàng)建文件。 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;}// 從源圖片復(fù)制一份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);// 循環(huán)利用資源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); // 循環(huán)利用資源 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 及以上 // 創(chuàng)建 ContentValues 對象,準備插入數(shù)據(jù) 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(); // 插入數(shù)據(jù),返回所插入數(shù)據(jù)對應(yīng)的Uri Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (uri == null) {return; } try {// 獲取剛插入的數(shù)據(jù)的Uri對應(yīng)的輸出流outputStream = contentResolver.openOutputStream(uri);FileInputStream fileInputStream = new FileInputStream(file);// 從一個流復(fù)制到另一個流上FileUtils.copy(fileInputStream, outputStream);//關(guān)閉流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); // 發(fā)廣播通知,更新相冊} });} } /** * 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; } /** * 根據(jù)手機的分辨率從 px(像素) 的單位 轉(zhuǎn)成為 dp */ public int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f); }

以上就是Android 版本、權(quán)限適配相關(guān)總結(jié)的詳細內(nèi)容,更多關(guān)于Android 版本、權(quán)限適配的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频一区欧美| 中文不卡在线| 欧美日韩夜夜| 欧美中文高清| 免费看久久久| 国产在线观看www| 午夜国产精品视频| 日韩毛片一区| 日产精品一区二区| 欧美中文一区二区| 在线观看视频免费一区二区三区| 亚洲tv在线| 蜜桃久久久久| 激情欧美国产欧美| 亚洲综合中文| 欧美精品观看| 日韩电影免费网站| 亚洲在线观看| 国产精品免费大片| 丝袜美腿一区| 亚洲影院天堂中文av色| 国产欧美三级| 色偷偷色偷偷色偷偷在线视频| 在线一区欧美| 国产suv精品一区二区四区视频| 97精品资源在线观看| 精品视频高潮| 欧美日韩国产高清电影| 日韩和欧美一区二区三区| 久久久久免费| 五月婷婷亚洲| 国产精品黄色| 久久亚洲风情| 日韩电影免费网址| 亚洲精品伊人| 日韩精品欧美| 国产日韩欧美一区二区三区| 久久国产中文字幕| 国产免费久久| 国产精品日韩欧美一区| 国产不卡一区| 日韩精品国产精品| 中文字幕系列一区| 国产精品网址| 国产视频久久| 在线中文字幕播放| 亚洲69av| 九九在线精品| 成人在线丰满少妇av| 日韩高清在线观看一区二区| 99精品在线| 久久精品国产网站| 亚洲精品国产日韩| 黑丝一区二区三区| 日韩精品专区| 欧美国产中文高清| 视频一区日韩精品| 99视频精品| 亚洲福利专区| 天堂а√在线最新版中文在线| 国产欧美自拍一区| 蜜桃久久av| 欧美亚洲在线日韩| 国产盗摄——sm在线视频| 国产精品日韩精品在线播放| 亚洲美女91| 亚洲欧美久久久| 少妇精品导航| 精品欧美日韩精品| 国产欧美午夜| 日韩av午夜在线观看| 久久国产精品久久w女人spa| 99精品国产一区二区三区| 国产盗摄——sm在线视频| 欧美a一区二区| 日韩国产91| 亚洲综合另类| 在线亚洲自拍| 夜夜嗨av一区二区三区网站四季av| 日韩精品一卡| 日本少妇一区| 日本久久成人网| 欧美精品资源| 91精品国产调教在线观看| 欧美精品高清| 久久久蜜桃一区二区人| 久久人人精品| 激情欧美一区二区三区| 免费观看不卡av| 激情欧美日韩一区| 国产一在线精品一区在线观看| 超碰成人av| 日韩高清中文字幕一区二区| 日韩理论片av| 欧美日韩在线二区| 黄色成人91| 免费视频最近日韩| 亚洲精品日本| 国产精品日本一区二区不卡视频| 国产精品一区高清| 久久久免费人体| 精品三级国产| 成人免费电影网址| 欧美日韩国产免费观看视频| 久久亚洲不卡| 日本中文字幕不卡| 欧美在线不卡| 国产一区二区三区成人欧美日韩在线观看| 国内揄拍国内精品久久| 日韩在线观看| 久久国产66| 国产精品亚洲综合久久| 日本一区二区高清不卡| 亚洲午夜91| 蜜臀va亚洲va欧美va天堂 | 欧美日韩精品一本二本三本| 亚洲在线观看| 日韩区欧美区| 成人一区不卡| 黄色日韩在线| 日韩成人精品一区二区三区 | 亚洲精品一区二区在线看| 久久都是精品| 国产精品.xx视频.xxtv| 日韩欧美一区免费| 美女精品网站| 国产日韩欧美一区在线| 精品伊人久久| 99riav1国产精品视频| 日韩av一区二区三区| 色网在线免费观看| 老司机久久99久久精品播放免费| 91精品福利观看| 成年男女免费视频网站不卡| 在线亚洲精品| 麻豆成人综合网| 激情丁香综合| 国产精品一级| 婷婷丁香综合| 免费在线亚洲欧美| 亚洲一区区二区| 久久精品天堂| 国产美女一区| 美女久久久久久| 亚洲黄色影院| 国产在视频一区二区三区吞精| 99国产精品99久久久久久粉嫩| 国产精品对白| 亚洲欧美日韩精品一区二区| 精品国产黄a∨片高清在线| 欧美日韩视频一区二区三区| 国产精品久一| 爽好多水快深点欧美视频| 成人一区而且| 日本视频一区二区| 国产一区久久| 成人在线视频区| 亚洲日本久久| 99精品在线观看| 麻豆精品在线观看| 综合激情网站| 九九综合在线| 国产v日韩v欧美v| 日韩精品午夜视频| 亚洲精品一区二区妖精| 高清av一区| 日本视频一区二区| 亚洲深夜影院| 999精品色在线播放| 欧美a在线观看| 日韩精品亚洲一区二区三区免费| 欧美特黄一级| 日韩免费高清| 久久精品国产久精国产| 欧美亚洲tv| 中文一区一区三区免费在线观 | 欧美成人基地 | 欧美日韩xxxx| 亚洲欧美视频一区二区三区| 日韩欧美在线中字| 久久精品色播| 国产精品主播| 国产亚洲欧美日韩在线观看一区二区| 美女国产一区| 夜夜嗨一区二区| 亚洲二区三区不卡| 99成人超碰| 国产一区二区三区久久| 国产精品白丝一区二区三区| 日韩在线麻豆| 亚洲三级网址| 首页亚洲欧美制服丝腿| 影院欧美亚洲| 欧美日韩激情| 亚洲午夜一级| 91久久久精品国产| 亚洲免费高清| 日韩影院精彩在线| 天堂av在线一区| 亚洲在线观看|