-1

我正在尝试向 Google+ 发送 JSON 对象和关联的缩略图。但我无法让它工作。例如,我得到以下响应:

05-30 22:38:16.819: E/AndroidRuntime(11643): FATAL EXCEPTION: main
05-30 22:38:16.819: E/AndroidRuntime(11643): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.SEND typ=application/json flg=0x80000 pkg=com.google.android.apps.plus (has extras) }
05-30 22:38:16.819: E/AndroidRuntime(11643):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1409)

这告诉我 Google+ 库没有找到处理“ application/json” MIME 类型的正确方法。我的代码(相关部分)像这样运行(我从Google+ 示例中获得了大部分代码):

PlusShare.Builder builder = new PlusShare.Builder(this, plusClient);

// Set call-to-action metadata.
builder.addCallToAction("VIEW_ITEM", callToActionUrl, callToActionDeepLinkId);
File thumbnailFile = generateThumbnail();
builder.setStream(Uri.fromFile(outputJSON()));
builder.setType("application/json");
thumbnailFile!=null?Uri.fromFile(thumbnailFile):null);

如果我避免将流设置为 JSON 类型,它似乎工作正常。我生成的 JSON 是这样的:

{"INSTRUMENTS":
      [{"MINOR":false,"CHANNEL":0,"MAJOR":false,"HIGH_RANGE":-8012206,
        "PROGRAM":1,"MAX_KEY":70,"NOTE_LENGTH":150,"LOW_RANGE":-16217748,
        "MIN_VELOCITY":60,"MIN_KEY":40},
       {"MINOR":false,"CHANNEL":2,"MAJOR":true,"HIGH_RANGE":-2790500,
        "PROGRAM":8,"MAX_KEY":90,"NOTE_LENGTH":150,"LOW_RANGE":-12114977,
        "MIN_VELOCITY":60,"MIN_KEY":70}]}

我见过不同的 API,它们告诉如何使用 Bitmaps 和 what-have-you 发送这样的 JSON 对象,但 Android API 文档有点……稀疏。有谁知道我如何在 Android 中做同样的事情?

理想情况下,一旦正确完成,帖子应包含:

  1. 图像的指纹
  2. JSON 数据,当用户从 Android 设备点击帖子时,我的应用将通过深度链接使用这些数据
  3. 用户编写的文本/标题
4

2 回答 2

2

您不能将图像或 JSON 数据附加到交互式帖子。因此,您的问题没有简单的答案。

一种选择是使用普通帖子而不是交互式帖子来分享您的缩略图 - http://googleplusplatform.blogspot.co.uk/2012/05/sharing-rich-content-from-your-android.html,但您也无法将 JSON 数据附加到此帖子。

使用交互式帖子的第二种替代方法是设置一个公开可见的 URL,该 URL 是带有builder.setContentUrl(Uri). 如果您创建一个包含以下内容的页面,例如:

<body itemscope itemtype="http://schema.org/WebPage">

<div itemscope itemtype="http://schema.org/Thing">

<img itemprop="image" src="http://example.com/path/to/thumbnail.jpg" />
<span itemprop="name">Name of your thing</span> 

<div class="data">{"INSTRUMENTS":
  [{"MINOR":false,"CHANNEL":0,"MAJOR":false,"HIGH_RANGE":-8012206,
    "PROGRAM":1,"MAX_KEY":70,"NOTE_LENGTH":150,"LOW_RANGE":-16217748,
    "MIN_VELOCITY":60,"MIN_KEY":40},
   {"MINOR":false,"CHANNEL":2,"MAJOR":true,"HIGH_RANGE":-2790500,
    "PROGRAM":8,"MAX_KEY":90,"NOTE_LENGTH":150,"LOW_RANGE":-12114977,
    "MIN_VELOCITY":60,"MIN_KEY":70}]}</div>

</div>
</body>

并使其在 上可用http://example.com/item1,然后您将能够创建这样的交互式帖子:

PlusShare.Builder builder = new PlusShare.Builder(this, plusClient);

// Set call-to-action metadata.
builder.setContentUrl(Uri.parse("http://example.com/thing1"));
builder.addCallToAction("VIEW_ITEM", Uri.parse("http://example.com/thing1"), deepLinkId);

然而,这意味着您必须加载和解析页面以检索您的 JSON 数据,这可能更好地托管在不同的 URL 上。

您可以将 JSON 数据放入 deepLinkId 本身,但请注意 deepLinkId 限制为 512 个字符,因为它不打算携带数据 - 仅用于识别资源。

于 2013-06-04T09:41:58.957 回答
0

Lee 的另一种方法可能有效,但您可能会将 JSON 数据作为帖子的深层链接 ID 传递。您可能希望对数据进行 base64 编码,将其用作深层链接 ID,然后当您捕获传入的深层链接时,对数据进行解编码并对其进行解析。

您必须确保编码的 JSON 数据保持在 512 个字符以下。不过,您当前的 JSON 片段在编码时有 524 个字符。

byte[] data = jsonData.getBytes("UTF-8");
String base64Json = Base64.encodeToString(data, Base64.DEFAULT);

if (base64.length() <= 512) {
Intent shareIntent = new PlusShare.Builder(this)
        .setText("Lemon Cheesecake recipe")
        .setType("text/plain")
        .setContentDeepLinkId(base64Json, /** Deep-link identifier */
                "Lemon Cheesecake recipe", /** Snippet title */
                "A tasty recipe for making lemon cheesecake.", /** Snippet description */
                Uri.parse("http://example.com/static/lemon_cheesecake.png"))
        .getIntent();

startActivityForResult(shareIntent, 0);
} else {
  // Do something different such as regular share, or try to get encoded length under 512
}

对于您的应用程序的传入链接,您将读取此数据的未编码并使用它。您需要非常小心地验证数据。

于 2013-06-07T14:44:19.030 回答