【问题标题】:Sending JSON data to Google Plus将 JSON 数据发送到 Google Plus
【发布时间】:2013-05-31 03:55:11
【问题描述】:

我正在尝试向 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 类型的正确方法。我的代码(相关部分)是这样运行的(大部分是从the Google+ examples 获得的):

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,它们告诉我们如何使用 Bitmap 和 what-have-you 发送此类 JSON 对象,但 Android API 文档有点……稀疏。有谁知道我如何在 Android 中做同样的事情?

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

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

【问题讨论】:

  • 您能否发布更完整的代码。目前尚不清楚您如何定义“构建器”变量。此外,您能否指出您希望生成的帖子看起来像什么 - 即。您打算如何让 Google+ 处理 application/json mime 类型?
  • @Lee :我添加了显示构建器实例化的代码。我还添加了关于我要完成的工作的解释。

标签: android json google-plus


【解决方案1】:

您不能将图像或 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 个字符,因为它不用于携带数据 - 仅用于识别资源。

【讨论】:

  • 是的……那是我认为我必须去的地方。你知道为什么他们有像'setStream()'和'setType()'这样的方法吗?它们对我来说似乎毫无用处。
  • 我确定 setStream 和 addStream 旨在反映 developer.android.com/reference/android/support/v4/app/… 中的用法,但它们的工作方式似乎不同。
  • 好像是这样。我认为您的回答是正确的,但是由于没有好的官方文档来描述这应该如何工作的“真实”方式,所以我将暂时搁置这个问题。
【解决方案2】:

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

您必须确保编码的 JSON 数据保持在 512 个字符以下。不过,您当前的 JSON sn-p 编码后输入为 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
}

对于您的应用的传入链接,您将读取一个未编码的数据并加以利用。您需要非常小心地验证数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2012-08-11
    • 2021-05-24
    相关资源
    最近更新 更多