android-getexternalstoragedirectory()不推荐使用后获取sd卡路径位置

xxe27gdn  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(503)

因此,在获取sd卡(外部存储器)的路径方面存在许多问题。问题是99%的so answer post函数在api29中被弃用了。 Environment.getExternalStorageDirectory() 文件建议如下作为备选方案
为了提高用户隐私,不推荐直接访问共享/外部存储设备。当应用程序以build.version\u codes.q为目标时,从该方法返回的路径将不再可由应用程序直接访问。应用程序可以通过迁移到context#getexternalfilesdir(string)、mediastore或intent#actionŠopenŠdocument等替代方法继续访问存储在共享/外部存储上的内容。
使用context.getexternalfilesdir(字符串)和intent#action#open#document
使用 Context.getExternalFilesDir(String) 建议在这里找到。下面示例中的文件.getabsolutepath()用于 file 返回如下路径:

/storage/emulated/0/Android/data/${getPackageName()}/files

代码示例

File file = new File(getExternalFilesDir(null), "VideoFile.mp4");

try {
    InputStream is = getResources().openRawResource(R.raw.video_file);
    OutputStream os = new FileOutputStream(file);
    byte[] data = new byte[is.available()];
    is.read(data);
    os.write(data);
    is.close();
    os.close();
} catch (IOException e) {
    Log.w("ExternalStorage", "Error writing " + file, e);
}

这会将文件复制到外部专用存储,但是尝试使用意图打开文件将导致android异常:

Uri uri = Uri.fromFile(file);

// type of file to view
in.setDataAndType(uri, "video/*");

// ask some other app to deal with it
startActivity(in);

例外情况:

Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/${getPackageName()}/files/talking.mp4 exposed beyond app through Intent.getData()
    at android.os.StrictMode.onFileUriExposed(StrictMode.java:2141)
    at android.net.Uri.checkFileUriExposed(Uri.java:2391)
    at android.content.Intent.prepareToLeaveProcess(Intent.java:11152)
    at android.content.Intent.prepareToLeaveProcess(Intent.java:11104)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1722)
    at android.app.Activity.startActivityForResult(Activity.java:5320)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
    at android.app.Activity.startActivityForResult(Activity.java:5278)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
    at android.app.Activity.startActivity(Activity.java:5664)
    at android.app.Activity.startActivity(Activity.java:5617)
    at ${getPackageName()}.MainActivity.btnPlayIntentClicked(MainActivity.java:132)

问题:
android提供了什么替代方法来获取sdcard/外部存储的路径,例如“/sdcard”(没有硬编码,请参见此)或 /storage/emulated/0/ 没有硬编码?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题