我正在尝试允许用户将图片分享到设备上的其他应用程序。该图片位于我的应用程序内部存储区域的files/子目录中。在Gmail中它可以正常工作,但当响应我的意图时,Facebook和Twitter都会崩溃。
编辑:Google+也可以正常工作。
以下是相关代码部分。
在Application.xml中
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.iforce2d.myapp.MyActivity"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
xml/filepaths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="shared" path="shared"/>
</paths>
这是我的活动中的共享代码:
File imagePath = new File(getContext().getFilesDir(), "shared");
File newFile = new File(imagePath, "snapshot.jpg");
Uri contentUri = FileProvider.getUriForFile(getContext(),
"org.iforce2d.myapp.MyActivity", newFile);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("image/jpeg");
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
List<ResolveInfo> resInfos =
getPackageManager().queryIntentActivities(shareIntent,
PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo info : resInfos) {
getContext().grantUriPermission(info.activityInfo.packageName,
contentUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivity(Intent.createChooser(shareIntent, "Share image..."));
当记录日志时,contentUri
的值为:
content://org.iforce2d.myapp.MyActivity/shared/snapshot.jpg
我只检查了Gmail、Facebook和Twitter这三个接收应用程序,但结果在广泛的操作系统版本(从2.2.1到4.4.3)和7个设备中都非常一致,其中包括一个Kindle。
Gmail表现良好。图像缩略图出现在邮件组合中,并在发送时成功附加到邮件中。
Twitter和Facebook两者都崩溃,如下所示。
以下是来自logcat的堆栈跟踪,显示这两个应用程序遇到的问题,它们似乎存在相同的问题(这是从4.4.3中获取的,但错误消息的措辞略有不同,但基本相同,即使回溯到2.2.1):
Caused by:
java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.
Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:434)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:114)
at com.twitter.library.media.util.f.a(Twttr:95)
...
Caused by:
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:434)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:114)
at com.facebook.photos.base.media.MediaItemFactory.b(MediaItemFactory.java:233)
...
鉴于在Facebook和Twitter上分享图片是数百万人每天都在做的事情,我很震惊它如此难以实现 :/
有人能看出我在这里做错了什么吗?
LegacyCompatCursorWrapper
的东西,这个东西是在同样的概念基础上创建的。在我的情况下,我使用了一个CursorWrapper
实现,以避免将Cursor
内容复制到MatrixCursor
中。但除此之外,它是相同的基本想法,感谢您指出这种方法! - CommonsWare