【问题标题】:Intent Filter for app in share menu - only show if LOCAL files are shared共享菜单中应用程序的意图过滤器 - 仅在共享本地文件时显示
【发布时间】:2015-06-12 15:39:08
【问题描述】:

我希望我的应用仅在共享本地可用文件时显示在共享菜单中。

目前它看起来像下面这样,但这会在共享图像时显示我的应用程序,无论图像是来自内部内容提供者还是文件系统上真实文件的路径是否被共享。

 <activity
        android:name=".activities.ViewerActivity"
        android:label="@string/app_name_sharing_to_display"
        android:theme="@style/AppThemeFullScreen"
        android:launchMode="singleTask" >
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND_MULTIPLE"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*"/>
        </intent-filter>
    </activity>

我收到如下本地路径,并将它们保存在历史记录中,我不需要也不需要其他文件。

private String getRealPathFromURI(Uri contentURI)
{
    String result = null;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null)
    {
        result = contentURI.getPath();
    }
    else
    {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        if (idx >= 0)
            result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

【问题讨论】:

    标签: android android-activity share intentfilter


    【解决方案1】:

    getRealPathFromURI() 甚至对于运行 Android 4.4 及更高版本的超过 5 亿台设备上的“本地文件”也不起作用。

    首先,您可能无法从MediaStore 获得Uri 值,因为还有其他可用于Android 的ACTION_GET_CONTENT 实现(例如Google Drive、Dropbox),它们的内容不一定在MediaStore 中。

    其次,MediaStore 不必支持 DATA 列作为保存一些本地文件系统路径。

    第三,如果文件位于您无权访问的可移动存储上,则该文件可能仍然无法访问。如果您不打算使用 ContentResolver 来支持 content:// Uri 值,那么您的应用程序对很多人将不会有用。

    话虽如此,欢迎您添加&lt;data&gt; 元素以将您的&lt;intent-filter&gt; 限制为仅file 方案。

    【讨论】:

    • 实际上它可以在我的 android 5.0 设备上运行...不过,我解释一下我的用例:我有一个应用程序,您可以与任何图片应用程序共享图片。我的应用程序显示这些包含所选图片的节目并将它们保存到数据库中,以便可以随时重新显示相同的节目。当然,前提是本地文件仍然存在。我应该怎么做呢? Content Uri 支持没问题,但是只要本地文件存在,那些 Uri 就有效吗?
    • 添加数据过滤器对我不起作用...尝试使用您在另一个问题的答案中发布的文件和内容...。如果我添加其中任何一个,我的应用程序不会显示在共享菜单中...
    • @prom85:“我应该怎么做呢?” -- 要么将图像复制到您的应用程序中,要么使用存储访问框架和takePersistableUriPermission() on ContentResolverUri 值不必是持久的(尽管它们有时是持久的)并且您对它们的访问不必是持久的(这就是 takePersistableUriPermission() 的用途)。 “当然,前提是本地文件还存在”——“本地文件是否还存在”由提供者决定。例如,Google Drive 可能会使用 LRU 算法来最小化磁盘空间。
    • @prom85:“如果我添加其中任何一个,我的应用程序就不会再出现在共享菜单中了”——啊,我没有注意到你正在使用ACTION_SENDACTION_VIEW 将与该方案一起使用。使用ACTION_SEND,您唯一可行的选择是将文件本地复制到您的应用程序,因为发件人实际上不需要长时间维护该数据。
    • TakePersistableUriPermission 听起来像我需要的东西,所以我不必知道本地路径(虽然我想显示路径,但这对我的应用程序来说并不重要)。我会试试你的建议。非常感谢
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多