因此,在获取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/
没有硬编码?
暂无答案!
目前还没有任何答案,快来回答吧!