标题
getExternalStoragePublicDirectory在安卓Q中被弃用[zt] 到下载目录的得到
clq
浏览(486) +
2022-11-03 17:08:34 发表
编辑
关键字:
http://www.manongjc.com/detail/23-trnjvacccfwyokl.html https://cloud.tencent.com/developer/ask/sof/222009 //-------------------------------------------------------- android 读写文件、列出根目录文件及新版本权限 时间:2021-04-15 本文章向大家介绍android 读写文件、列出根目录文件及新版本权限,主要包括android 读写文件、列出根目录文件及新版本权限使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 想列出android 内部存储根目录(内部存储也是sd卡形式) File path = Environment.getExternalStorageDirectory(); File[] files=path.listFiles(); for(int i=0;i<files.length;i++){ str1 += files[i].getAbsolutePath()+","; } textView.setText("bb"+str1); 发现老是提示报错 ,debug 发现eacces,是权限问题 1、先在AndroidManifest.xml 里 </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 还加了 <application android:allowBackup="true" android:requestLegacyExternalStorage="true" 发现还没有用,即使在手机权限里加上还不行 2、加上下面代码好了,新版本需要用下面的方式 private final int REQUEST_EXTERNAL_STORAGE = 1; private String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; public void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } 然后在 onCreate 里调用 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { verifyStoragePermissions(this); 3、后面处理读写文件也ok了 try { File urlFile = new File(str3+"/sd/test.txt"); Log.e("-----------","111"); InputStreamReader isr = new InputStreamReader(new FileInputStream(urlFile), "UTF-8"); BufferedReader br = new BufferedReader(isr); Log.e("-----------","112221"); String str = ""; String mimeTypeLine = null ; while ((mimeTypeLine = br.readLine()) != null) { str = str+mimeTypeLine; } Log.e("-----------",str); textView.setText(str); } catch (Exception e) { e.printStackTrace(); } 原文地址:https://www.cnblogs.com/cnchengv/p/14664560.html //-------------------------------------------------------- getExternalStoragePublicDirectory在安卓Q中被弃用 浏览 346关注 0回答 5得票数 97 原文 因为Android Q中已经弃用了getExternalStoragePublicDirectory,所以建议使用其他方法。那么,我们如何指定要将相机应用程序中生成的照片存储到DCIM文件夹或DCIM中的自定义子文件夹中 文档指出,以下3个选项是新的首选替代方案: Context#getExternalFilesDir(String) MediaStore Intent#ACTION_OPEN_DOCUMENT 选项1是不可能的,因为这意味着如果应用程序被卸载,照片将被删除。 选项3也不是一个选择,因为它需要用户通过SAF文件资源管理器选择位置。 我们只剩下第二种选择,MediaStore;但在这个问题的时候,还没有关于如何在Android Q中使用它来替代getExternalStoragePublicDirectory的文档。 原文 分享 反馈 PerracoLabs修改于2021-06-04 14:55 5 个回答 高票数最新 CommonsWare 回答于2019-06-06 06:13已采纳 得票数 79 根据文档,对the RELATIVE_PATH使用DCIM/...,其中...是您的定制子目录。所以,你最终会得到这样的结果: val resolver = context.contentResolver val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, "CuteKitten001") put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/PerracoLabs") } val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) resolver.openOutputStream(uri).use { // TODO something with the stream } 请注意,由于RELATIVE_PATH是API Level 29的新成员,因此您需要在较新的设备上使用此方法,而在较旧的设备上使用getExternalStoragePublicDirectory()。 收藏0 评论46 分享 反馈 原文 Gaurav Mall 修改于2020-03-24 01:00 得票数 36 @CommonsWare答案令人惊叹。但是对于那些想要在Java中使用它的人,您需要尝试一下: ContentResolver resolver = context.getContentResolver(); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); 根据@SamChen的建议,文本文件的代码应如下所示: Uri uri = resolver.insert(MediaStore.Files.getContentUri("external"), contentValues); 因为我们不想让txt文件停留在Images文件夹中。 所以,我有mimeType的地方,你输入你想要的mime类型。例如,如果你想要txt (@Panache),你应该用这个字符串替换mimeType:"text/plain"。下面是mime类型的列表:https://www.freeformatter.com/mime-types-list.html 另外,在我有变量name的地方,您可以将它替换为本例中的文件名。 收藏0 评论14 分享 反馈 原文 Codemaker 回答于2021-01-25 22:56 得票数 3 由于安全问题,默认情况下,针对安卓Q- API 29+的应用程序会禁用存储访问。如果要使其能够在AndroidManifest.xml中添加以下属性: <manifest ... > <!-- This attribute is "false" by default for Android Q or higher --> <application android:requestLegacyExternalStorage="true" ... > ... </application> </manifest> 那么你必须使用getExternalStorageDirectory()而不是getExternalStoragePublicDirectory()。 例如:如果你想在内部存储中创建一个目录,如果不存在。 File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/SampleFolder"); // Create the storage directory if it does not exist if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ Log.d("error", "failed to create directory"); } } 收藏0 评论3 分享 反馈 原文 Nick Kovalsky 回答于2021-03-07 18:26 得票数 1 对于Xamarin.Android,来自已发布项目的以下代码可能会有所帮助: Java.IO.File jFolder; if ((int)Android.OS.Build.VERSION.SdkInt >= 29) { jFolder = new Java.IO.File(Android.App.Application.Context.GetExternalFilesDir(Environment.DirectoryDcim), "Camera"); } else { jFolder = new Java.IO.File(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDcim), "Camera"); } if (!jFolder.Exists()) jFolder.Mkdirs(); var filename = GenerateJpgFileName(); var jFile = new Java.IO.File(jFolder, filename); var fullFilename = jFile.AbsoluteFile.ToString(); using (var output = new System.IO.FileStream(fullFilename, System.IO.FileMode.Create)) { outputBitmap.Compress(Bitmap.CompressFormat.Jpeg, 90, output); output.Close(); } 在Android中没有使用权限,它是在共享项目中使用Xamarin.Essentials完成的。 收藏0 评论2 分享 反馈 原文 Mori 回答于2021-03-08 19:08 得票数 0 通常我是这样使用的: var data: File =Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { data = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)!! } 收藏0 评论2 分享 反馈
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.