登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: getExternalStoragePublicDirectory在安卓Q中被弃用[zt] 到下载目录的得到     [回主站]     [分站链接]
标题
getExternalStoragePublicDirectory在安卓Q中被弃用[zt] 到下载目录的得到
clq
浏览(303) + 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
分享
反馈




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1