【问题标题】:Share audio file from /data/user/0/ directory using FileProvider使用 FileProvider 从 /data/user/0/ 目录共享音频文件
【发布时间】:2017-10-17 12:10:47
【问题描述】:

我正在使用FileProvider API 来共享实际存储在内部存储中的内容。

以下是我的 xml 配置,它与 Manifiest 文件中配置的 Provider 链接。

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="xs_audio" path="/audio/records"/>
</paths>

我用来分享的代码如下:

    private final static String FILE_PROVIDER = BuildConfig.APPLICATION_ID + ".fileprovider";
        
    private String testPackageAppHaveAccess = "com.whats";
            public static void shareDocument(Activity activity, CallRecordData data) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_SEND_MULTIPLE);
                intent.putExtra(Intent.EXTRA_SUBJECT, "Record File");
                intent.setType("audio/*");
        
                ArrayList<Uri> files = new ArrayList<>();
                //for (AudioModelObj image : data.getDocuments()) {
                    files.add(getImageUri(activity, data.getFile()));
                //}
        
                activity.grantUriPermission(testPackageAppHaveAccess, files.get(0), Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files);
                activity.startActivity(Intent.createChooser(intent, "Share Audio File."));
            }
        
            private static Uri getImageUri(Activity activity, String audioURI) {
                if (Build.VERSION.SDK_INT < 24) {
                    return Uri.parse(audioURI);
                } else {
                    URI uri = URI.create(audioURI);
                    File file = new File(uri);
                    return FileProvider.getUriForFile(activity, FILE_PROVIDER, file);
                }
            }
}

但是在使用应用程序启动时,它没有附加任何东西。如果是gmail,它会说“无法附加空文件”。文件已确认可用,因为我正在显示文件列表并正在播放。

供参考:从 getImageUri(..) 生成的 Uri 是

/data/user/0/com.xl.cl.debug/cache/audio/records/17-10-17_170728_abc_.wav

任何建议我做错了什么?

【问题讨论】:

  • Google 的 FileProvider 杂乱无章,好像是初级开发人员设计的一样。 Google 自称是 Android 的终极权威,但它连基本的能力都没有……

标签: android audio android-intent android-fileprovider android-sharing


【解决方案1】:
  • &lt;files-path&gt; 已经指向某些设备上的 /data/user/0/com.xl.cl.debug

  • &lt;cache-path&gt; 是您应该使用的,将 path 替换为仅感兴趣的子目录 (audio/records),消除 /data/user/0/com.xl.cl.debug/cache

  • 你调用的是grantUriPermission(),其中第一个参数不是包

  • 您正在调用grantUriPermission(),其中第一个参数不是标识您尝试授予权限的应用程序的包

  • 您没有将FLAG_GRANT_READ_URI_PERMISSION 添加到Intent,这是说“此Intent 中的Uri 应由此Intent 的收件人读取”的典型方式(尽管ACTION_SEND_MULTIPLE 可能需要在这里做更多的工作,因为我没有玩过那么多)

  • 人类历史上没有任何文件系统路径以content:/ 开头,所以去掉它

  • 调用 new File() 并提供一个不是文件系统路径的值将无法正常工作

可能还有比这些更多的问题,但这应该可以帮助您开始

【讨论】:

  • AFAIK,根据developer doc activity.grantUriPermission 是正确的,它应该使用 Context 对象调用。并且添加应该允许共享的应用程序的包名称不是硬编码,因为用户可以拥有多个应用程序。请检查我是否已更新问题。
  • 我也想分享一个音频文件,这是正确的方法吗?
  • @code:去掉 URI,只创建文件。使用特定的 MIME 类型,而不是通配符。您可以从一个简单的 ACTION_SEND 和一个 Uri 开始。
  • 摆脱 URI 并创建文件 但是那将如何共享呢?任何建议的例子!!
  • @CoDe:摆脱URI uri = URI.create(audioURI);。将以 File file = new File(audioURI); 替换以下行。您的部分问题是您认为 /data/user/0/com.xl.cl.debug/cache/audio/records/17-10-17_170728_abc_.wav 是一个 URI,但事实并非如此。这是一个文件系统路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多