I want my app to only show up in the share menu if local available files are shared.
Currently it looks like following, but this shows my app whenever images are shared, no matter if the are from a internal content provider or if paths to real files on the file system are shared.
<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>
I'm receiving the local path like following and I save them in a history, I don't want nor need other files.
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;
}
That
getRealPathFromURI()
will not work even for "local files" on >500 million devices, running Android 4.4 and higher.First, you may not get
Uri
values fromMediaStore
, as there are otherACTION_GET_CONTENT
implementations available for Android (e.g., Google Drive, Dropbox), and their contents are not necessarily inMediaStore
.Second,
MediaStore
does not have to support theDATA
column as holding some local filesystem path.Third, the file may still be inaccessible, if it is on removable storage, for which you have no access. If you are not going to support
content://
Uri
values using aContentResolver
, your app will not be useful to many people.That being said, you are welcome to add a
<data>
element to limit your<intent-filter>
to onlyfile
schemes.