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

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

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

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

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

  1. <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  2. <uses-permission android:name="android.permission.INTERNET" />
  3. <uses-permission android:name="android.permission.CAMERA" />
  4. <uses-permission android:name="android.permission.FLASHLIGHT" />
  5. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  7. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  8. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  9. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  10. <uses-permission android:name="android.permission.BLUETOOTH" />
  11. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  12. <uses-permission android:name="android.permission.VIBRATE" />
  13. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  14. <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  15. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  16. <uses-permission
  17. android:name="android.permission.QUERY_ALL_PACKAGES"
  18. tools:ignore="QueryAllPackagesPermission" />
  19. <application
  20. android:name=".MainApplication"
  21. android:allowBackup="false"
  22. android:fullBackupContent="false"
  23. android:fullBackupOnly="false"
  24. android:icon="@mipmap/ic_launcher"
  25. android:label="@string/app_name"
  26. android:roundIcon="@mipmap/ic_launcher_round"
  27. android:theme="@style/AppTheme"
  28. android:usesCleartextTraffic="true"
  29. android:largeHeap="true"
  30. android:hardwareAccelerated="false"
  31. tools:targetApi="31"
  32. android:requestLegacyExternalStorage="true"
  33. >
jbose2ul

jbose2ul1#

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

j5fpnvbx

j5fpnvbx2#

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

  1. <uses-permission
  2. android:name="android.permission.READ_EXTERNAL_STORAGE"
  3. android:maxSdkVersion="32" />
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  5. android:maxSdkVersion="32"/>

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

  1. val intent = Intent(Intent.ACTION_SEND)
  2. intent.type = "application/pdf"
  3. val uri = FileProvider.getUriForFile(
  4. requireContext(),
  5. this.getString(R.string.fileprovider_authority),
  6. File(it)
  7. )
  8. intent.putExtra(Intent.EXTRA_STREAM, uri)
  9. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
  10. val pendingIntent = PendingIntent.getBroadcast(
  11. requireContext(),
  12. 0,
  13. receiver,
  14. PendingIntent.FLAG_IMMUTABLE
  15. )
  16. val chooser = Intent.createChooser(
  17. intent,
  18. getString("Chooser Title eg file name"),
  19. pendingIntent.intentSender
  20. )
  21. requireActivity().grantUriPermission(
  22. packageName,
  23. uri,
  24. Intent.FLAG_GRANT_READ_URI_PERMISSION
  25. )
  26. this.startActivity(chooser)
展开查看全部

相关问题