随着最近发布的Android Q Beta的发布,getExternalStoragePublicDirectory()
被弃用。现在,如果有人要创建文件夹,则必须使用getExternalFilesDir()
或MediaStore。但我正在开发一个应用程序,用户单击该应用程序即可下载他的个人资料图片,然后使用Firebase Storage下载它。现在,下载过程可以完美地进行,真正的问题是将其存储在文件中。现在,我不想像以下这样存储在我的私人数据文件夹中:
File file = new File(getExternalFilesDir(), "file.jpg");
我希望将其下载到“下载”文件夹中,因此我需要使用不建议使用的方法。是否有一种新的方式将文件存储在“下载”或“ Android Q音乐及更高版本”之类的文件夹中?我该怎么办?
注意:昨天我以不同的方式问了这个问题,但答案并不令我满意。所以我决定用更具体的细节问这个问题。
编辑:我确实在这里查看了文档:https://developer.android.com/preview/privacy/scoped-storage。实际上,前三天我一直在研究,但是我不知道如何在我的应用程序中实现它。一个例子,将不胜感激。
此外,我使用的是 Java ,而不是Kotlin。
答案 0 :(得分:2)
首先,下载图像并保存到您的私人文件夹,如下所示: File file = new File(getExternalFilesDir(),“ file.jpg”);
接下来,像这样抓取刚刚下载的图像文件的content:// uri: Uri sourceUri = resolver.insert(imageCollections,values);
然后,在以下位置的下载文件夹中获取目标文件的content:// uri 外部存储如下: Uri destinationUri = data.getData();
从sourceUri创建InputStream,如下所示: FileInputStream fis =(FileInputStream)this.getContentResolver()。openInputStream( sourceUri);
从destinationUri创建OutputStream,如下所示: FileOutputStream fos =(FileOutputStream) this.getContentResolver()。openOutputStream(destination);
将文件从源复制到目标。
所有: //成功下载图像文件后...
String path = fullPathToRecentlyDownloadedImage;
路径应为 像:/storage/emulated/0/Android/data/yourAppPackageName/files/ImageFolder/imageName.png
不要对其进行硬编码。
Uri imageCollections = MediaStore.Image.Media.getContentUri( "external" );
ContentValues values = new ContentValues();
values.put( MediaStore.Image.Media.DISPLAY_NAME, nameOfImage );
values.put( MediaStore.Image.Media.MIME_TYPE, imageMimeType );
values.put( MediaStore.Image.Media.DATE_ADDED, dateAdded );
values.put( MediaStore.Image.Media.DATA, path );
Uri sourceUri= resolver.insert( imageCollections , values);
然后,在以下位置的下载文件夹中获取目标文件的content:// uri 外部存储
Intent i = new Intent();
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ) {
i.setAction( Intent.ACTION_CREATE_DOCUMENT );
i.addCategory( Intent.CATEGORY_OPENABLE );
i.setType( imageMimeType );
i.putExtra( Intent.EXTRA_TITLE, nameOfImage );
startActivityForResult( i, 1000 );
}
content:// uri将被推送到MainActivity的onActivityResult()函数中,如下重写该函数:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Super.onActivityResult(requestCode, resultCode, data);
if ( requestCode == 1000 && data != null ){
destinationUri = data.getData();
我们现在有了目标和源目录:// uris,初始化这些uris的输入和输出流以及将字节从源复制到目标都由您决定。
注意:上面的意图代码将打开“另存为”活动,导航到“下载”文件夹,然后单击“保存”。
希望会有所帮助
答案 1 :(得分:-1)
您是否在此处查看此文档: https://developer.android.com/preview/privacy/scoped-storage
为了访问另一个应用程序创建的其他文件, 包括“下载”目录中的文件,您的应用必须使用 存储访问框架,允许用户选择特定的 文件。
也许这对您也有帮助: https://developer.android.com/guide/topics/providers/document-provider