2016-09-22 76 views
0

我愿意创建一个应用程序,发送图片回复android.intent.action.GET_CONTENT的意图。我的用例是来自Play商店的Messenger应用程序,我猜是最常见的短信/彩信应用程序。发送图像回应android.intent.action.GET_CONTENT

我试图发送图片,但效果不好。当将彩信发送到Android手机时,他们可以正常使用,但iPhone似乎将其显示为从不玩的虚拟视频。
我知道这可能是由我或外国运营商的MMSC服务器引起的,它认为它很聪明,并将数据转码为它所猜测的格式良好的数据。

但是,当将其他应用程序使用相同的意图(尝试Google的Photos应用程序和Solid Explorer)时,它适用于Android和iPhone。

我的猜测是照片和实体探索者以适当的格式发回数据,MMS应用程序正确地发送到MMSC,原样发送图片。

这里是我的尝试:

  1. 发送我的文件的简单Uri在缓存中(通过Content#getExternalCacheDir():不工作
  2. 发送使用StreamProvider我的文件的Uri,使用CommonWare's CWAC lib,通过设置LocalPathStrategyContext#getExternalCacheDir()作为根路径:不工作

两种策略都以图像发回给MMS应用程序正确显示,并且该按钮变为“发送彩信”;然后在Android上收到它作为图片,在iOS上这是一个不起作用的虚假视频。

我应该如何将数据发送回调用应用程序?

只是实际解释我做什么,这里是第一策略:

Intent result = new Intent(); 
result.setData(Uri.fromFile(localImage)); 
setResult(Activity.RESULT_OK, result); 
finish(); 

这里是第二:

Intent result = new Intent(); 
result.setData(PROVIDER 
     .buildUpon() 
     .appendPath(StreamProvider.getUriPrefix(AUTHORITY)) 
     .appendPath(localImage.getName()) 
     .build()); 
result.setFlags(FLAG_GRANT_READ_URI_PERMISSION); 
setResult(Activity.RESULT_OK, result); 
finish(); 

我想我可以通过位图字节数据的意图,但我没有想出办法做到这一点。

+1

测试MMS以外的内容,看看这些方法之间的差异。例如,将其作为电子邮件附件发送。或者,创建一个'ACTION_GET_CONTENT'客户端,测试各种场景,并比较你得到的结果。此外,您可能会考虑将MIME类型附加到响应“意图”,以防万一。 – CommonsWare

+0

我会跟客户路线走,那真棒。我应该想到这一点!谢谢。 –

+0

我的意图和Solid Explorer之间的唯一区别是我的标志设置为1('FLAG_GRANT_READ_URI_PERMISSION'),并且它们具有定义的MIME类型。我猜他们的提供者没有和你的旗帜一样的安全级别。我已经提供了MIME类型,但仍然失败。 Google照片的标志= 1,还有一个额外的剪辑数据,这是一个包含与内容相同的URI的项目的“text/uri-list”。所以,因为我的结果意图几乎与Solid Explorer和Google Photos相同,所以我猜测它在提供商方面。有没有设置的MIME类型? –

回答

1

是的,它看起来像setResult()也需要与FLAG_GRANT_READ_URI_PERMISSION和/或FLAG_GRANT_WRITE_URI_PERMISSION一个Intent,如果您使用的结果Uri一个ContentProvider

addFlags()工程,这些标志至少添加回Intent,以API级别19.我没有测试过比这更旧,所以有可能是版本,你必须使用ClipData招:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) { 
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
} 
else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) { 
    ClipData clip= 
    ClipData.newUri(getContentResolver(), "A photo", outputUri); 

    i.setClipData(clip); 
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
} 
else { 
    List<ResolveInfo> resInfoList= 
    getPackageManager() 
     .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

    for (ResolveInfo resolveInfo : resInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    grantUriPermission(packageName, outputUri, 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    } 
}