最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android存儲權(quán)限兼容問題解析

 更新時(shí)間:2025年02月19日 08:31:22   作者:onthewaying  
在?Android?開發(fā)中,存儲權(quán)限是一個常見且重要的權(quán)限,不同版本的?Android?系統(tǒng)對于存儲權(quán)限的管理和處理方式存在差異,這就導(dǎo)致了開發(fā)者在處理存儲權(quán)限時(shí)會遇到各種兼容問題,本文將詳細(xì)介紹?Android?各版本存儲權(quán)限的變化,以及如何進(jìn)行兼容處理,并給出具體的代碼示例

一、引言

在 Android 開發(fā)中,存儲權(quán)限是一個常見且重要的權(quán)限。不同版本的 Android 系統(tǒng)對于存儲權(quán)限的管理和處理方式存在差異,這就導(dǎo)致了開發(fā)者在處理存儲權(quán)限時(shí)會遇到各種兼容問題。本文將詳細(xì)介紹 Android 各版本存儲權(quán)限的變化,以及如何進(jìn)行兼容處理,并給出具體的代碼示例。

二、Android 各版本存儲權(quán)限變化

2.1 Android 6.0(API 級別 23)之前

在 Android 6.0 之前,應(yīng)用的權(quán)限在安裝時(shí)一次性授予。只要用戶安裝了應(yīng)用,應(yīng)用就擁有了在 AndroidManifest.xml 中聲明的所有權(quán)限,無需在運(yùn)行時(shí)再次請求。例如,要使用存儲權(quán)限,只需在 AndroidManifest.xml 中添加如下代碼:

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

2.2 Android 10(API 級別 29)及之后

Android 10 引入了分區(qū)存儲(Scoped Storage)機(jī)制,對應(yīng)用訪問外部存儲的方式進(jìn)行了重大改變。應(yīng)用默認(rèn)只能訪問自己的專屬目錄(如 Context.getExternalFilesDir() 返回的目錄)和媒體文件,訪問其他應(yīng)用的文件需要特殊處理。同時(shí),WRITE_EXTERNAL_STORAGE 權(quán)限不再授予普通應(yīng)用,除非應(yīng)用在 AndroidManifest.xml 中聲明 android:requestLegacyExternalStorage="true" 以使用舊的存儲模式。

2.3 Android 11(API 級別 30)及之后

Android 11 進(jìn)一步加強(qiáng)了分區(qū)存儲的限制,android:requestLegacyExternalStorage 屬性不再起作用,應(yīng)用必須適應(yīng)分區(qū)存儲。不過,Android 11 提供了一些新的 API 來處理文件訪問,如 MediaStore API 用于訪問媒體文件。

三、兼容處理方案及代碼示例

3.1 權(quán)限檢查與請求

以下是一個在 Android 6.0 及以上版本中請求存儲權(quán)限的代碼示

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 檢查是否已經(jīng)授予存儲權(quán)限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 如果沒有授予權(quán)限,則請求權(quán)限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_CODE);
        } else {
            // 已經(jīng)授予權(quán)限,執(zhí)行相關(guān)操作
            performStorageOperation();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用戶授予了權(quán)限,執(zhí)行相關(guān)操作
                performStorageOperation();
            } else {
                // 用戶拒絕了權(quán)限,給出提示
                Toast.makeText(this, "存儲權(quán)限被拒絕,無法執(zhí)行操作", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void performStorageOperation() {
        // 執(zhí)行存儲相關(guān)操作
        Toast.makeText(this, "開始執(zhí)行存儲操作", Toast.LENGTH_SHORT).show();
    }
}

3.2 Android 10 及以上版本的分區(qū)存儲處理

在 Android 10 及以上版本中,使用分區(qū)存儲可以通過 Context.getExternalFilesDir() 訪問應(yīng)用的專屬目錄。以下是一個簡單的文件讀寫示例:

import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class StorageActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_storage);

        // 獲取應(yīng)用的外部存儲專屬目錄
        File externalFilesDir = getExternalFilesDir(null);
        if (externalFilesDir != null) {
            // 創(chuàng)建一個文件
            File file = new File(externalFilesDir, "test.txt");
            try {
                // 寫入文件
                FileOutputStream fos = new FileOutputStream(file);
                String content = "Hello, World!";
                fos.write(content.getBytes());
                fos.close();
                Toast.makeText(this, "文件寫入成功", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(this, "文件寫入失敗", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

3.3 Android 11 及以上版本的媒體文件訪問

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MediaAccessActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_access);

        // 獲取 ContentResolver
        ContentResolver contentResolver = getContentResolver();
        // 定義查詢的 URI
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        // 定義查詢的列
        String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
        // 執(zhí)行查詢
        Cursor cursor = contentResolver.query(uri, projection, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                // 獲取圖片的 ID 和文件名
                long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
                String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
                Toast.makeText(this, "圖片 ID: " + id + ", 文件名: " + displayName, Toast.LENGTH_SHORT).show();
            }
            cursor.close();
        }
    }
}

四、總結(jié)

在 Android 開發(fā)中,處理存儲權(quán)限兼容問題需要根據(jù)不同版本的系統(tǒng)特點(diǎn)進(jìn)行相應(yīng)的處理。在 Android 6.0 及以上版本中,要使用運(yùn)行時(shí)權(quán)限機(jī)制;在 Android 10 及以上版本中,要適應(yīng)分區(qū)存儲;在 Android 11 及以上版本中,要使用新的 API 進(jìn)行文件訪問。通過合理的權(quán)限管理和文件操作,可以確保應(yīng)用在不同版本的 Android 系統(tǒng)上都能正常運(yùn)行。

以上就是Android存儲權(quán)限兼容問題解析的詳細(xì)內(nèi)容,更多關(guān)于Android存儲權(quán)限兼容的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android Handler內(nèi)存泄漏原因及解決方案

    Android Handler內(nèi)存泄漏原因及解決方案

    這篇文章主要介紹了Android Handler內(nèi)存泄漏原因及解決方案,幫助大家更好的理解和利用Android進(jìn)行開發(fā),感興趣的朋友可以了解下
    2021-02-02
  • 如何使用Flutter開發(fā)一款電影APP詳解

    如何使用Flutter開發(fā)一款電影APP詳解

    這篇文章主要給大家介紹了關(guān)于如何使用Flutter開發(fā)一款電影APP的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Android下拉列表spinner的實(shí)例代碼

    Android下拉列表spinner的實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了Android下拉列表spinner的實(shí)例代碼。感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android IPC機(jī)制綁定Service實(shí)現(xiàn)本地通信

    Android IPC機(jī)制綁定Service實(shí)現(xiàn)本地通信

    本文主要介紹Android IPC機(jī)制綁定Service 實(shí)現(xiàn)本地通信,通過圖解,代碼等方式給大家解釋Android IPC機(jī)制,需要參考的同學(xué)可以看一下
    2016-07-07
  • Android集成微信登錄的步驟詳解

    Android集成微信登錄的步驟詳解

    這篇文章給大家整理Android集成微信登錄的詳細(xì)步驟,通過文章整理的內(nèi)容,大家只需要幾行代碼就可以實(shí)現(xiàn)微信登錄的功能了,剛興趣的朋友們下面來一起看看吧。
    2016-09-09
  • Android ClassLoader加載機(jī)制詳解

    Android ClassLoader加載機(jī)制詳解

    Android的ClassLoader負(fù)責(zé)加載.dex文件,基于雙親委派模型,支持熱修復(fù)和插件化,需注意類沖突、內(nèi)存泄漏和兼容性問題,本文給大家介紹Android ClassLoader加載機(jī)制詳解,感興趣的朋友一起看看吧
    2025-07-07
  • Android用ActionBar高仿微信主界面的實(shí)例代碼

    Android用ActionBar高仿微信主界面的實(shí)例代碼

    這篇文章主要介紹了Android用ActionBar高仿微信主界面的實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android單選多選按鈕的使用方法

    Android單選多選按鈕的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android單選多選按鈕的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • android開發(fā)教程之實(shí)現(xiàn)toast工具類

    android開發(fā)教程之實(shí)現(xiàn)toast工具類

    這篇文章主要介紹了android開發(fā)中需要的toast工具類,需要的朋友可以參考下
    2014-05-05
  • Android編程使用Service實(shí)現(xiàn)Notification定時(shí)發(fā)送功能示例

    Android編程使用Service實(shí)現(xiàn)Notification定時(shí)發(fā)送功能示例

    這篇文章主要介紹了Android編程使用Service實(shí)現(xiàn)Notification定時(shí)發(fā)送功能,涉及Android服務(wù)Service控制通知的發(fā)送功能相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08

最新評論

洪雅县| 鲁山县| 贵南县| 潞城市| 应城市| 洛南县| 武冈市| 阳西县| 房产| 辽宁省| 沁阳市| 个旧市| 喀什市| 天峻县| 庆城县| 丽江市| 马龙县| 红河县| 西安市| 崇文区| 喀喇沁旗| 鸡西市| 宝山区| 轮台县| 昆明市| 荆门市| 三河市| 出国| 广东省| 德惠市| 马关县| 临汾市| 洛扎县| 渑池县| 日土县| 和龙市| 淳化县| 伊金霍洛旗| 咸宁市| 湟中县| 梁山县|