原生开发QQ分享本地图片的坑

官方资料

首先我们来看下关于qq分享的官方文档

Android: 分享消息到QQ(无需QQ登录) — QQ互联WIKI

iOS: 分享到QQ和QQ空间 — QQ互联WIKI

SDK下载 — QQ互联WIKI

如果以后链接失效了可以直接在QQ开放平台上找

官方文档: QQ互联WIKI

如果你认为和其它平台的sdk接口文档一样step by step就ok的话,那你就太天真了。其它之前登录的文档也有一些同样的照着写完全跑不通的错误,好在多年之后,已经修正了,但share的文档依然不清不楚,很容易搞错。根据经验,可能官方文档的维护人员都是临时工吧。

言归正传,直接上代码吧。

iOS分享

最终代码如下,后边再具体解释

-(void)qqShareImage {[TencentOAuth setIsUserAgreedAuthorization:YES];[[TencentOAuth alloc] initWithAppId:qqAppIdandUniversalLink:@"https://www.mycompany.domain/qq_conn/10000000"andDelegate:self];NSData *imgData = [NSData dataWithContentsOfFile:_shareImgPath];QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imgDatapreviewImageData:niltitle:_shareTitledescription :_shareDescription];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];//将内容分享到dispatch_async(dispatch_get_main_queue(), ^{QQApiSendResultCode sent = [QQApiInterface sendReq:req];DLog(@"Result Code: %d", (int) sent);});}

要点说明:

1. 按目前app普遍的用户隐私权限要求,一般应用都会有让用户同意授权的环节,分享操作通常在这一环节之后,那么我们可以直接标记用户已同意授权

[TencentOAuth setIsUserAgreedAuthorization:YES];

2. 初始化必须有UniversalLink参数,这个link地址需要在后台配置并验证通过

这个具体的方法直接在网上搜UniversalLink就有很详细的教程,这里是官方说明文档Universal Links适配FAQ — QQ互联WIKI,注意下Associated Domains里要增加applinks:www.mycompany.domain(即与后台配置相同的域名),另外也包括Xcode中Queried URL Schemes的相关设置内容,分享也会用到,这里就不再赘述了。

3. 创建QQApiImageObject对象时,如果图片本身比较大,previewImageData参数需要自行添加一个小的图片,如果没有小图片,或没有什么特殊的要求直接传个nil也是可以的。

4. 注意发起分享的线程问题。

iOS这边基本就这些内容了,下边的Android的部分。

Android分享

还是先上代码:

public void qqShareLocalImage(String imagePath) {try {if (mTencent == null) {mTencent = Tencent.createInstance(APP_ID, context, context.getPackageName() + ".fileprovider");}if(this.iUiListener == null) {this.iUiListener = new QQShareUiListener();}mTencent.setIsPermissionGranted(true);Bundle params = new Bundle();params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, imagePath);params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);params.putString(QQShare.SHARE_TO_QQ_APP_NAME, context.getResources().getString(R.string.app_name));//params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);mTencent.shareToQQ(context, params, this.iUiListener);} catch (Exception e) {e.printStackTrace();}}

几个要点

1.  实例化要带fileprovider参数,这个文档里说了,没问题

mTencent = Tencent.createInstance(APP_ID, context, context.getPackageName() + ".fileprovider");

2. 和iOS一样,要标记用户已授权

mTencent.setIsPermissionGranted(true);

3. 这玩意通常情况应该注了,用默认值,用户自行选择分享到会话还是空间

params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);

4. 然后最大的问题来了,就是这一句

params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, imagePath);

这个imagePath是什么呢,文件路径,没错,但文档里提到了需要用到fileprovider来共享文件权限,这个有什么关系呢?

我们来看下官方的文档  分享功能存储权限适配 — QQ互联WIKI

如果你对fileprovider不是很熟,完全照做还好,如果你本身了解 fileprovider,自己来实现,就可能踩到另一个坑

这个path不是给你的示例,是sdk里真的就是写死的这个path,他的具体操作流程是,你传入的imagePath应该是一个本地的绝对路径,如/data/user/0/com.xxx.myapp.....  然后sdk会将文件copy到外存储的Images/tmp目录下,然后转到fileprovider的形式分享出去,也就是说红框这一句是必须要有的,而不能想当然认为是传入的imagePath所在路径对应的配置。

 以上这些内容如果都注意到了,分享这块基本就没啥大问题了,有什么问题欢迎大家批评指正。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部