如何将文件下载到下载文件夹等

时间:2019-08-26 10:20:45

标签: java android

随着最近发布的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。

2 个答案:

答案 0 :(得分:2)

  1. 首先,下载图像并保存到您的私人文件夹,如下所示: File file = new File(getExternalFilesDir(),“ file.jpg”);

  2. 接下来,像这样抓取刚刚下载的图像文件的content:// uri: Uri sourceUri = resolver.insert(imageCollections,values);

  3. 然后,在以下位置的下载文件夹中获取目标文件的content:// uri 外部存储如下: Uri destinationUri = data.getData();

  4. 从sourceUri创建InputStream,如下所示: FileInputStream fis =(FileInputStream)this.getContentResolver()。openInputStream( sourceUri);

  5. 从destinationUri创建OutputStream,如下所示: FileOutputStream fos =(FileOutputStream) this.getContentResolver()。openOutputStream(destination);

  6. 将文件从源复制到目标。


所有: //成功下载图像文件后...

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