是否可以通过媒体存储访问特定于应用程序的外部存储文件夹?

科什朗

正如标题所述,我正在我的应用程序指定的外部目录(android / data / com.xxx.xxx)中保存一些文件-大多数是音频文件-现在我想通过Mediastore访问这些音频文件,但我不能怎么做我这样做吗?媒体商店是否可以访问这种私有目录?

值得一提的是,整个数据目录都有一个.nomedia文件

更新:

文件保存在... / android / data / com.xxx.xxx / files / musicgetExternalFilesDir文件中

mediastore找到其他音频文件,但无法访问该目录中的我的文件

context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                BASE_PROJECTION, selection, selectionValues, sortOrder);

UPDATE2:创建文件后在扫描后使用

private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.e("tag", "Failed to get asset file list.", e);
    }
    if (files != null) for (String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(filename);

            File outFile = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC), filename);
            out = new FileOutputStream(outFile);
            copyFile(in, out);

            ///////////////////////////////////////////////////////////////////////////////////
            // Tell the media scanner about the new file so that it is
            // immediately available to the user.
            MediaScannerConnection.scanFile(this,
                    new String[] { outFile.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("ExternalStorage", "Scanned " + path + ":");
                            Log.i("ExternalStorage", "-> uri=" + uri);
                        }
                    });

            Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();


        } catch(IOException e) {
            Log.e("tag", "Failed to copy asset file: " + filename, e);
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // NOOP
                }
            }

        }
    }
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}
科什朗

经过一天半的搜索和调试之后,我找到了以下解决方案:我没有找到该解决方案:媒体商店无权访问应用程序特定的外部目录,为了使媒体商店有权访问它们,您应该将文件复制到媒体目录,如下所示:

private void copyFiles() {

    File directory = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString());
    File[] files = directory.listFiles();

    for (int i = 0; i < files.length; i++)
    {

        String videoFileName = files[i].getName();

        ContentValues valuesaudios;
        valuesaudios = new ContentValues();
        valuesaudios.put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/" + "Folder");
        valuesaudios.put(MediaStore.Audio.Media.TITLE, videoFileName);
        valuesaudios.put(MediaStore.Audio.Media.DISPLAY_NAME, videoFileName);
        valuesaudios.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mp3");
        valuesaudios.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
        valuesaudios.put(MediaStore.Audio.Media.DATE_TAKEN, System.currentTimeMillis());
        valuesaudios.put(MediaStore.Audio.Media.IS_PENDING, 1);
        ContentResolver resolver = getContentResolver();
        Uri collection = MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
        Uri uriSavedAudio = resolver.insert(collection, valuesaudios);


        ParcelFileDescriptor pfd;

        try {
            pfd = getContentResolver().openFileDescriptor(uriSavedAudio, "w");

            FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());
            File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString());
            File imageFile = new File(storageDir, files[i].getName());

            FileInputStream in = new FileInputStream(imageFile);


            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0) {

                out.write(buf, 0, len);
            }


            out.close();
            in.close();
            pfd.close();




        } catch (Exception e) {

            e.printStackTrace();
        }


        valuesaudios.clear();
        valuesaudios.put(MediaStore.Audio.Media.IS_PENDING, 0);
        getContentResolver().update(uriSavedAudio, valuesaudios, null, null);
        Toast.makeText(this, files[i].getName(), Toast.LENGTH_SHORT).show();
    }



}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建文件并将其存储在Java Web应用程序文件夹中

Spring Server自动删除存储在应用程序文件夹中的文件

如何将应用程序生成的文件存储在Android的“下载”文件夹中?

是否可以存储wwwroot文件夹以外的图像

Laravel应用程序共享托管,存储文件夹符号链接问题

内部或外部存储,可编辑特定于应用程序的文件

安装时将图像存储在应用程序数据文件夹中

如何通过云功能访问Firebase存储内的特定文件夹?

我想使用Powershell将Web应用程序的特定文件和文件夹备份到Blob存储中

如何访问应用程序特定的文件夹并将其用于备份或某些应用程序特定的数据?迅速

应用中的Android打开外部存储文件夹

显示未存储在R Shiny应用程序内www文件夹中的PDF文件

Eclipse RCP:特定于应用程序的文件夹

设置Web服务器以写权限访问应用程序/存储中的文件夹的权限

如何使用c#从外部应用程序访问特定文件夹中的Outlook 2013联系人?

访问Corona SDK中的内部存储特定文件夹

将文件从应用程序安装文件夹复制到本地存储

无法配置Apache以使Web应用程序能够访问DocumentRoot外部的文件夹

是否可以通过我无法控制的应用程序访问存储在我的帐户中的iCloud / CloudKit数据?

是否可以仅针对特定应用程序更改Temp文件夹?

Laravel显示来自存储/应用程序文件夹的图像路径

是否可以在Play之外访问文件!应用程序文件夹?

用于将存储桶中特定文件夹的“内容类型”设置为“应用程序/pdf”的 Amazon S3 存储桶策略

TortoiseGit:是否可以只克隆 git 存储库中的特定文件夹?

如何使用 Laravel 从我的应用程序中的私人文件夹中存储和访问图像?

便携式应用程序的 C# 存储文件夹位置

限制 Azure 应用程序对 OneDrive 中特定文件夹的访问

在 Laravel 中存储特定于应用程序的 conf 文件的最佳位置

Flutter:android 不允许应用程序在外部存储中创建一个新文件夹来保存文件?