【问题标题】:How to read WhatsApp media path如何阅读 WhatsApp 媒体路径
【发布时间】:2018-08-13 20:09:58
【问题描述】:

我正在创建一个聊天应用程序,我在其中从 WhatsApp 等图库中上传图像和视频,但是当我尝试选择已由 WhatsApp 文件夹下载的图像时,我得到了这个路径

/storage/emulated/0/WhatsApp/Media/WhatsAppImages/IMG-20180717-WA0024.jpg

但是当我阅读这篇文章以获得显示图像的真实路径时,我得到了这个异常:

java.io.FileNotFoundException:打开失败:ENOENT(没有这样的文件或目录)

这是我的提供者

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

下面是文件路径

<resources>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="/storage/emulated/0" path="."/>
</paths>

这仅发生在 WhatsApp 媒体上,请告诉我解决方案。

提前致谢

【问题讨论】:

  • 你能添加你的java文件代码吗?您是否将提供程序添加到代码中?
  • @LearningAlways 是的,我在清单中添加了这个
  • 请用清单文件和一些java代码编辑你的ans。这可能会产生错误。而不是在注释中添加代码。
  • @LearningAlways 已编辑,请立即查看
  • 您是否将您的 android:authorities="${applicationId}" 更改为喜欢 android:authorities="com.ex.example.fileprovider"。试试这个以获得更多参考,请参阅下面的答案

标签: android android-contentprovider filepath whatsapp android-storage


【解决方案1】:

android:authorities="${applicationId}" 这里的应用 id 包含你的项目包名。

在你的应用程序 gradle 文件中定义

 defaultConfig {
        applicationId "<your app Id>"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 25
        versionName '5.8'
        multiDexEnabled true
    }

/////

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="<package name>.fileprovider" // which are defined in app gradle application id
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public" />
        </provider>

你的 xml 文件应该是这样的

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_files"
        path="." />
</paths>

和你的java代码一样。 这里 file 是您尝试访问的文件路径

Uri uri = null;
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    uri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() +
                            ".provider", file);
                } else {
                    uri = Uri.fromFile(file);
                }

uri 中获取路径后,对它做任何你想做的事情。

为了获得真正的路径,试试这个它可能会起作用。

public String getRealPathFromURI(Uri contentURI) {
        String result;
        Cursor cursor = context.getContentResolver().query(contentURI, null,
                null, null, null);

        if (cursor == null) { // Source is Dropbox or other similar local file
            // path
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            try {
                int idx = cursor
                        .getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                result = cursor.getString(idx);
            } catch (Exception e) {
                AppLog.handleException(ImageHelper.class.getName(), e);
                Toast.makeText(context, context.getResources().getString(
                        R.string.error_get_image), Toast.LENGTH_SHORT).show();

                result = "";
            }
            cursor.close();
        }
        return result;
    }

【讨论】:

  • 您是否将您的 android:authorities="${applicationId}" 更改为喜欢 android:authorities="com.ex.example.fileprovider"。试试这个
  • 我得到了这个 uri content://com.example.myapp/external_files/WhatsApp/Media/WhatsAppImages/IMG-20180717-WA0024.jpg 但仍然无法获得真实路径
  • 这是您在 marshmellow 设备上方的真实路径。您可以使用该 uri 访问此文件。如果需要,您还可以将 uri 转换为字符串。
  • 如果您不介意将您的 java 代码块发送到您遇到任何错误或异常的地方
  • 权限被拒绝:打开提供者 com.whatsapp.MediaProvider
【解决方案2】:

当我将视频从 whatsapp 共享到我的应用程序时,错误抛出列“_data”不存在 java.lang.IllegalArgumentException:列“_data”不存在

【讨论】:

  • 我也使用此方法。此方法在文件管理器中工作。但我从 whatsapp 共享视频或徒步到我的应用程序抛出异常 column_data 不存在并且非法ArgumentException 请帮助我...跨度>
猜你喜欢
  • 2022-12-11
  • 2014-01-08
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多