Android / Google Plus - 无法与我的内容提供商共享图片

时间:2014-12-21 16:42:24

标签: android image google-plus share android-contentprovider

我已经使用了this code,并且可以使用我的Android应用中的文字谷歌+成功分享图像(来自我手机的图库)。

但是,当我尝试从我应用的内容提供商发布图片时,图片会显示在我的Google +页面上,就像这样......

enter image description here

...即使想要的图像在Google +应用预览屏幕上正常显示也是如此。

我用来分享的代码是:

String message = "My message"; 
Uri localImageUri = ContentUris.withAppendedId(DbContentProvider.CONTENT_URI_PRODUCTS, mProductId;
PlusShare.Builder builder = new PlusShare.Builder(getActivity());
builder.setText(message);
builder.addStream(localImageUri);
builder.setType("image/jpeg");
Intent shareIntent = builder.getIntent();
startActivityForResult(shareIntent, RC_GOOGLE_PLUS);

...而且,就像我说的那样,如果localImageUri值是我手机图库中的资源,则图片会在最终的Google +页面上成功显示 - 而上面的占位符图片会显示如果我从应用程序自己的内容提供商处将localImageUri设置为uri。

所以我认为我的内容提供商一定存在问题,在我的清单中定义为:

<provider
    android:name=".DbContentProvider"
    android:authorities="com.example.provider"
    android:exported="true"
    android:grantUriPermissions="true" />

那么,我的清单中是否会遗漏某些内容 - 甚至是我的searchable.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search_hint"

    android:searchSuggestAuthority="com.example.provider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestIntentData="content://com.example.provider/suggest"
    android:searchSuggestThreshold="3"

    android:includeInGlobalSearch="true"
    android:searchSettingsDescription="@string/search_settings_description"
    android:queryAfterZeroResults="true"
    android:voiceSearchMode="showVoiceSearchButton" >   
</searchable>

如果没有,那么问题是什么呢?

更新(遵循CommonsWare的评论)

Google+图书馆确实引发了例外情况,因为在_data列(已存在)上进行查询时,Google+ API也在寻找不存在的列 - 即{{ 1}},datetakendate_added

所以我已将这些列添加到我的数据库表中 - 将它们全部添加为date_modified列,其中包含最近的millis值,例如text(ref here)但我仍然获得相同的占位符图片显示在我的Google+信息页上。

所以我在'1419379390000'类的query()方法中添加了一些日志记录代码,当google +对DbContentProvider执行单列查询时,游标中返回的值确实是1419379390000但是,(单独的)datetaken查询返回的值为_data

我不确定为什么谷歌API会查询null列(因为当我从数据库中检索图像以便在UI上显示时,我不需要在我的代码中调用它 - 相反,我打电话给...

_data

...但是我的光标中可能是Uri localImageUri = ContentUris.withAppendedId(DbContentProvider.CONTENT_URI_PRODUCTS, mProductId); InputStream in = cr.openInputStream(localImageUri); Bitmap img = BitmapFactory.decodeStream(in); imageView.setImageBitmap(img); 值的空值是问题所在。不知道从哪里开始解决这个问题,不过??

2014年12月30日更新

这是LogCat输出。所以,当我点击我的g +按钮...

_data

...显示用于自定义共享消息的g +屏幕(我确认,它确实包含来自我的内容提供商的图像)。然后我点击g +屏幕上的Share按钮,LogCat输出是......

12-30 21:45:34.344: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668)
12-30 21:45:34.534: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668)
12-30 21:45:34.544: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)
12-30 21:45:34.584: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)
12-30 21:45:34.604: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)
12-30 21:45:34.604: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)
12-30 21:45:34.624: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)

2015年1月23日更新

这是我的清单:

12-30 21:45:57.526: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r)
12-30 21:45:57.576: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668)
12-30 21:45:57.576: D/DbContentProvider(24633): DbContentProvider -  query(content://com.example.provider/products/1668)
12-30 21:45:57.576: D/DbContentProvider(24633):  -      projection: {"datetaken"}
12-30 21:45:57.576: D/DbContentProvider(24633):  -      selection: null
12-30 21:45:57.576: D/DbContentProvider(24633):  -      selectionArgs: null
12-30 21:45:57.576: D/DbContentProvider(24633):  -      sortOrder: null
12-30 21:45:57.576: D/DbContentProvider(24633): SQL (without selectionArgs): SELECT datetaken FROM products WHERE (_id = 1668) LIMIT 1
12-30 21:45:57.596: D/DbContentProvider(24633): returned value: 1419379390000
12-30 21:45:57.596: D/DbContentProvider(24633): cursor count: 1
12-30 21:46:03.642: D/DbContentProvider(24633): getType("content://com.example.provider/products/1668") - returns "vnd.android.cursor.item/vnd.example.elemental"

1 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。如果导出了ContentProvider(问题中并不完全清楚 - 它似乎是您发布的第一个代码段,而不是之后添加的完整AndroidManifest.xml中)您正在做什么应该工作。不知道为什么没有。

无论如何,您当然可以通过FileProvider分享任何图片文件到Google+应用:

  

FileProvider是ContentProvider的一个特殊子类,便于使用   通过创建一个安全共享与应用程序关联的文件   content:// Uri代表文件而不是file:/// Uri。

因此,如果您的图片实际上是getFilesDir()下的文件(非常可能),或者至少可以移动到那里,那么您可以应用此解决方案。

首先,您必须在AndroidManifest.xml文件中定义提供程序:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.testshare.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>

然后这个文件在res\xml\filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="shared_images" path="shared_images/" />
</paths>

然后,要共享图像文件,请首先确保它位于上面指定的路径中(即shared_images下的getFilesDir() - 您不需要WRITE_EXTERNAL_STORAGE权限才能复制因为这个位置在你自己的应用程序的私人存储区域内。然后按如下方式构建共享意图:

File file = getImageFileToShare();
Uri fileUri = FileProvider.getUriForFile(this, "com.example.testshare.fileprovider", file);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
intent.setType("image/png");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(intent);

(确保getUriForFile()方法中指定的权限与清单中的权限匹配。

这会产生一个content:// Uri(例如content://com.example.testshare.fileprovider/shared_images/img1.png,以便Google+应用可以访问,因此会包含在帖子中)。