Android微信分享
通过使用微信SDK,在第三方应用中加入分享到朋友圈功能(图片、文字)。
准备工作
注册成为微信开放平台的开发者,申请自己的应用需要以下几点:
应用名
包名
应用图标(两种分辨率)
应用网站
总体来说,注册过程比较麻烦,还需要审核什么的。
最终获取AppId
和AppSecret
,这两个东西非常重要,不过暂时对我们来说用不着。
微信示例程序
事实上这就是微信开放平台官网给的第三方应用,网上下载这个源码后导入到Eclipse工程中,就可以直接部署到手机上,应用名叫做Wechat SDK Demo22
。但是这里出现了一点小插曲:
按照第三方应用调用微信SDK的流程,首先需要将应用注册,然后再实现分享文字,图片等功能。但是部署后点击分享死活掉不出微信分享的界面,或者说闪一下又返回————分享不成功。
最终解决办法:
在Eclipse的上方工具栏选择 Window->Preference->Android->Build
进入如下界面:
如图所示修改debug.keystore的路径,这里我们找到该示例项目的绝对路径即可,例如我的是:
F:\Android\workspace\amm_sdk_sample\debug.keystore
而对于C:\Users\hp.android\debug.keystore,这是我们自己的签名,在之后编写自己的第三方应用时会用到。
再次将应用部署到手机上,就可以实现各个功能了。
使用微信SDK部署自己的第三方应用
首先我们按照自己填写的包名创建Android项目,编写相应的代码。以我的示例来说:定义两个Button,一个Button用来注册我的应用,另一个Button用来分享本地SD上的图片到朋友圈。
具体流程可以参照Wechat SDK Demo22
,我也会在后面给出我自己的测试代码。
这里我就说说我遇到的两个问题:
调不出分享界面
解决办法:
- 这里首先按照上述提到的方法修改debug.keystore为自己的签名C:\Users\hp.android\debug.keystore,将应用部署到手机上。
- 获取程序签名的工具:http://open.weixin.qq.com/download/sdk/gen_signature.apk
- 运行这个gen_sinature输入自己的包名,这次会生成一个新的应用签名,去微信开放平台的后台用这个签名替换之前的。
- 至此再次运行第三方应用,问题解决。
分享图片没有响应
具体表现
点击分享图片后,程序正常执行,LogCat也没有报出任何错误,但是程序也没有任何响应,分享失败。
解决办法
WXMediaMessage msg = new WXMediaMessage();
这个对象有个成员变量thumbData
表示分享图片的缩略图,这个缩略图的大小必须小于32Kb,在extractThumbnail()
方法中修改THUMB_SIZE后就可以了。
附录
MainActivity.java
public class MainActivity extends Activity {
private IWXAPI api;
private static final int THUMB_SIZE = 100;
private static final String SDCARD_ROOT = Environment
.getExternalStorageDirectory().getAbsolutePath();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
api = WXAPIFactory.createWXAPI(getApplicationContext(),
"your AppID", true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void RegisterToWeChat(View v) {
api.registerApp("your AppId");
}
public void ShareToWeChat(View v) {
String text = "test share";
String path = SDCARD_ROOT + "/Desert.png";
File file = new File(path);
if (!file.exists()) {
Toast.makeText(getApplicationContext(),"找不到文件"+" path = " + path,
Toast.LENGTH_LONG).show();
//break;
}
WXImageObject imgObj = new WXImageObject();
imgObj.setImagePath(path);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
msg.title="title";
msg.description="description";
Bitmap bmp = BitmapFactory.decodeFile(path);
Bitmap thumbBmp=ThumbnailUtils.extractThumbnail(bmp, THUMB_SIZE, THUMB_SIZE);
bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbBmp, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene =SendMessageToWX.Req.WXSceneTimeline;//朋友圈
api.sendReq(req);
// finish();
// 发送文字
// WXTextObject textObj = new WXTextObject();
// textObj.text = text;
// WXMediaMessage msg = new WXMediaMessage();
// msg.mediaObject = textObj;
// msg.description = text;
// SendMessageToWX.Req req = new SendMessageToWX.Req();
// req.transaction = String.valueOf(System.currentTimeMillis());
// //req.scene = SendMessageToWX.Req.WXSceneTimeline;
// req.message = msg;
// api.sendReq(req);
}
private Bitmap extractThumbnail(Bitmap bmp, int thumbSize, int thumbSize2) {
// TODO Auto-generated method stub
return null;
}
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis())
: type + System.currentTimeMillis();
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/btnRegister"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/register"
android:onClick="RegisterToWeChat"/>
<Button
android:id="@+id/btnShare"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/share"
android:onClick="ShareToWeChat"/>
</LinearLayout>