searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Android存储权限详解及代码示例

2024-08-05 09:31:36
151
0

在Android开发中,存储权限是一个非常重要的话题。Android系统为了保护用户的隐私和数据安全,对应用程序访问设备存储空间进行了严格的限制。本文将详细介绍Android存储权限的相关知识,并提供代码示例来演示如何在应用程序中请求和使用存储权限。

一、Android存储简介

Android系统分为内部存储和外部存储。内部存储是应用程序私有的,只能被该应用程序本身访问,且容量相对较小。外部存储则可以被多个应用程序访问,容量较大但可能不稳定。外部存储包括设备的ROM和外部SD卡等。

1. 内部存储

内部存储不需要任何权限即可访问,路径通常以/data开头,例如/data/data/<applicationId>/files/data/data/<applicationId>/cache。通过context.getFilesDir()context.getCacheDir()可以获取这些目录。

2. 外部存储

外部存储需要相应的权限才能访问,路径通常在/storage/mnt下。外部存储分为私有外部存储和公共外部存储。私有外部存储只能被应用本身访问,而公共外部存储可以被多个应用访问。

二、存储权限的申请与使用

1. 权限声明

在AndroidManifest.xml文件中声明存储权限。对于外部存储,通常需要声明READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限。从Android 10(API level 29)开始,引入了Scoped Storage,限制应用只能访问其专属目录和特定媒体文件,但老版本的权限声明依然需要。

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

2. 运行时权限请求

从Android 6.0(API level 23)开始,引入了运行时权限机制。这意味着,除了在AndroidManifest.xml中声明权限外,还需要在运行时动态请求用户授权。

以下是一个请求存储权限的示例代码:

public class MainActivity extends AppCompatActivity {  
    private static final int REQUEST_STORAGE_PERMISSION = 1;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        // 检查是否已经获得存储权限  
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)  
                != PackageManager.PERMISSION_GRANTED) {  
            // 未获得权限,向用户请求权限  
            ActivityCompat.requestPermissions(this,  
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},  
                    REQUEST_STORAGE_PERMISSION);  
        } else {  
            // 已经获得权限,可以进行存储操作  
            performStorageOperation();  
        }  
    }  
  
    @Override  
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
        if (requestCode == REQUEST_STORAGE_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
            // 用户授权成功,可以进行存储操作  
            //performStorageOperation();  
        } else {  
            // 用户拒绝授权  
            Toast.makeText(this, "存储权限被拒绝", Toast.LENGTH_SHORT).show();  
        }  
    }  
  
    private void performStorageOperation() {  
        // 在这里进行存储操作  
    }  
}
 

3. 使用存储权限

获得存储权限后,可以开始使用存储功能。以下是一个读写外部存储的示例代码:

// 获取外部存储文件的路径  
File externalStorageDirectory = Environment.getExternalStorageDirectory();  
File file = new File(externalStorageDirectory, "test.txt");  
  
// 写入文件  
try (FileOutputStream fos = new FileOutputStream(file)) {  
    fos.write("Hello, World!".getBytes());  
} catch (IOException e) {  
    e.printStackTrace();  
}  
  
// 读取文件  
try (FileInputStream fis = new FileInputStream(file)) {  
    byte[] buffer = new byte[fis.available()];  
    fis.read(buffer);  
    String content = new String(buffer);  
    Toast.makeText(this, content, Toast.LENGTH_SHORT).show();  
} catch (IOException e) {  
    e.printStackTrace();  
}
 
 

注意:从Android 10开始,推荐使用Scoped Storage,通过MediaStore或DocumentsContract API来访问和存储文件,而不是直接访问文件系统的路径。

三、最佳实践

  • 只请求必要的权限:不要请求不必要的权限,以减少用户困扰。
  • 解释权限用途:在请求权限前,向用户解释为什么需要该权限。
  • 适配不同版本:根据Android的不同版本,适配相应的存储权限机制。

 

0条评论
作者已关闭评论
张****龙
18文章数
0粉丝数
张****龙
18 文章 | 0 粉丝
张****龙
18文章数
0粉丝数
张****龙
18 文章 | 0 粉丝
原创

Android存储权限详解及代码示例

2024-08-05 09:31:36
151
0

在Android开发中,存储权限是一个非常重要的话题。Android系统为了保护用户的隐私和数据安全,对应用程序访问设备存储空间进行了严格的限制。本文将详细介绍Android存储权限的相关知识,并提供代码示例来演示如何在应用程序中请求和使用存储权限。

一、Android存储简介

Android系统分为内部存储和外部存储。内部存储是应用程序私有的,只能被该应用程序本身访问,且容量相对较小。外部存储则可以被多个应用程序访问,容量较大但可能不稳定。外部存储包括设备的ROM和外部SD卡等。

1. 内部存储

内部存储不需要任何权限即可访问,路径通常以/data开头,例如/data/data/<applicationId>/files/data/data/<applicationId>/cache。通过context.getFilesDir()context.getCacheDir()可以获取这些目录。

2. 外部存储

外部存储需要相应的权限才能访问,路径通常在/storage/mnt下。外部存储分为私有外部存储和公共外部存储。私有外部存储只能被应用本身访问,而公共外部存储可以被多个应用访问。

二、存储权限的申请与使用

1. 权限声明

在AndroidManifest.xml文件中声明存储权限。对于外部存储,通常需要声明READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限。从Android 10(API level 29)开始,引入了Scoped Storage,限制应用只能访问其专属目录和特定媒体文件,但老版本的权限声明依然需要。

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

2. 运行时权限请求

从Android 6.0(API level 23)开始,引入了运行时权限机制。这意味着,除了在AndroidManifest.xml中声明权限外,还需要在运行时动态请求用户授权。

以下是一个请求存储权限的示例代码:

public class MainActivity extends AppCompatActivity {  
    private static final int REQUEST_STORAGE_PERMISSION = 1;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        // 检查是否已经获得存储权限  
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)  
                != PackageManager.PERMISSION_GRANTED) {  
            // 未获得权限,向用户请求权限  
            ActivityCompat.requestPermissions(this,  
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},  
                    REQUEST_STORAGE_PERMISSION);  
        } else {  
            // 已经获得权限,可以进行存储操作  
            performStorageOperation();  
        }  
    }  
  
    @Override  
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
        if (requestCode == REQUEST_STORAGE_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
            // 用户授权成功,可以进行存储操作  
            //performStorageOperation();  
        } else {  
            // 用户拒绝授权  
            Toast.makeText(this, "存储权限被拒绝", Toast.LENGTH_SHORT).show();  
        }  
    }  
  
    private void performStorageOperation() {  
        // 在这里进行存储操作  
    }  
}
 

3. 使用存储权限

获得存储权限后,可以开始使用存储功能。以下是一个读写外部存储的示例代码:

// 获取外部存储文件的路径  
File externalStorageDirectory = Environment.getExternalStorageDirectory();  
File file = new File(externalStorageDirectory, "test.txt");  
  
// 写入文件  
try (FileOutputStream fos = new FileOutputStream(file)) {  
    fos.write("Hello, World!".getBytes());  
} catch (IOException e) {  
    e.printStackTrace();  
}  
  
// 读取文件  
try (FileInputStream fis = new FileInputStream(file)) {  
    byte[] buffer = new byte[fis.available()];  
    fis.read(buffer);  
    String content = new String(buffer);  
    Toast.makeText(this, content, Toast.LENGTH_SHORT).show();  
} catch (IOException e) {  
    e.printStackTrace();  
}
 
 

注意:从Android 10开始,推荐使用Scoped Storage,通过MediaStore或DocumentsContract API来访问和存储文件,而不是直接访问文件系统的路径。

三、最佳实践

  • 只请求必要的权限:不要请求不必要的权限,以减少用户困扰。
  • 解释权限用途:在请求权限前,向用户解释为什么需要该权限。
  • 适配不同版本:根据Android的不同版本,适配相应的存储权限机制。

 

文章来自个人专栏
linux相关
18 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0