如何在Android中根据API级别访问设备的外部存储

gxwragnw  于 2023-06-20  发布在  Android
关注(0)|答案(2)|浏览(126)

我正在尝试创建文件目录以保存日志文件。由于支持不同的API级别以不同方式访问外部存储,因此我必须编写与每个API级别兼容的代码。这是我的代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    // For Android 10 (API level 29) and above
    path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
} else {
    // For Android 9 (API level 28) and below
    path = Environment.getExternalStorageDirectory().getAbsolutePath();
}
    File logsDir = new File(path + "/agent_logs");
    if (!logsDir.exists() && !logsDir.mkdirs()) {
        throw new RuntimeException("Unable to create directory");
    }

这段代码是完美的工作在Android水平10和Android水平10以上的设备.它不适用于Android级别10,API级别29。添加此代码后,甚至应用程序在android 10设备中也无法打开。有什么问题吗?
我也将这些权限添加到AndroidManifest.xml中。

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission
        android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />

<application
        android:name=".MainApplication"
        android:allowBackup="false"
        android:fullBackupContent="false"
        android:fullBackupOnly="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        android:largeHeap="true"
        android:hardwareAccelerated="false"
        tools:targetApi="31"
        android:requestLegacyExternalStorage="true"
        >
jbose2ul

jbose2ul1#

将android:requestLegacyExternalStorage=“true”添加到清单文件中的应用程序标记。

j5fpnvbx

j5fpnvbx2#

如果您使用的是Android 11及更高版本,则需要更改读取/写入数据到外部存储的方式。请参阅Android documentation以了解更多信息。请记住新权限MANAGE_EXTERNAL_STORAGE和找到的Storage Access Frameworkhere

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

如果您希望用户自己将数据保存在其他地方,那么我建议使用Intent。沿着如下的东西:

val intent = Intent(Intent.ACTION_SEND)
intent.type = "application/pdf"
val uri = FileProvider.getUriForFile(
    requireContext(),
    this.getString(R.string.fileprovider_authority),
    File(it)
)
intent.putExtra(Intent.EXTRA_STREAM, uri)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

val pendingIntent = PendingIntent.getBroadcast(
    requireContext(),
    0,
    receiver,
    PendingIntent.FLAG_IMMUTABLE
)
val chooser = Intent.createChooser(
    intent,
    getString("Chooser Title eg file name"),
    pendingIntent.intentSender
)

requireActivity().grantUriPermission(
    packageName,
    uri,
    Intent.FLAG_GRANT_READ_URI_PERMISSION
)

this.startActivity(chooser)

相关问题