微信分享
一,微信分享步骤详解
1,用命令行或者签名生成工具生成APK签名(个人习惯用命令行
http://www.tttabc.com/android/keytool-keystore-jarsigner-apk.htm);
2,使用生成的APK签名去微信开发者平台
https://open.weixin.qq.com/cgi-bin/index?注册本项目并获取分享的APP_ID,
如何现在没有AppID可以先下载官方的Demo使用Demo中的AppID即可。
SDK和Demo下载地址:https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&target=res/app_download_android
(注意:包名必须一致,图片不能大于32K);
(注意:包名必须一致,图片不能大于32K);
3,下载libammsdk.jar拷贝到lib文件夹下面;
二,代码解析
1.首先在AndroidManifest.xml文件中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.weixinsharedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.example.weixinsharedemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.weixinsharedemo.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
</application>
</manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.weixinsharedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.example.weixinsharedemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.weixinsharedemo.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
</application>
</manifest>
2.MainActivity类
package com.example.weixinsharedemo;
import com.example.weixinsharedemo.wxapi.WXEntryActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button mJump;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mJump = (Button) findViewById(R.id.jump);
mJump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WXEntryActivity.class);
startActivity(intent);
}
});
}
}
import com.example.weixinsharedemo.wxapi.WXEntryActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button mJump;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mJump = (Button) findViewById(R.id.jump);
mJump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WXEntryActivity.class);
startActivity(intent);
}
});
}
}
3.Constants类
package com.example.weixinsharedemo;
public class Constants {
// 内测
// wx8aa3cecd4ae0bfb1
// 正式,在微信开发平台申请的APP_ID
// wx9b33035585ded3b1
public static final String APP_ID = "wx8aa3cecd4ae0bfb1";
public static final String APP_WX_ID = "wx6128540a7eb302e8";
}
public class Constants {
// 内测
// wx8aa3cecd4ae0bfb1
// 正式,在微信开发平台申请的APP_ID
// wx9b33035585ded3b1
public static final String APP_ID = "wx8aa3cecd4ae0bfb1";
public static final String APP_WX_ID = "wx6128540a7eb302e8";
}
4.SystemUtil类
package com.example.weixinsharedemo;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
public class SystemUtil {
private static Activity mActivity = null;
public SystemUtil(Activity activity) {
mActivity = activity;
}
// /** 微信是否打开*/
public void openWx(String packageName) {
PackageManager manager = mActivity.getPackageManager();
Intent intent = manager.getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);
}
// /** 是否安装微信*/
public boolean isInstallWx(String packageName) {
try {
PackageManager manager = mActivity.getPackageManager();
PackageInfo info = manager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
if (info != null) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
public class SystemUtil {
private static Activity mActivity = null;
public SystemUtil(Activity activity) {
mActivity = activity;
}
// /** 微信是否打开*/
public void openWx(String packageName) {
PackageManager manager = mActivity.getPackageManager();
Intent intent = manager.getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);
}
// /** 是否安装微信*/
public boolean isInstallWx(String packageName) {
try {
PackageManager manager = mActivity.getPackageManager();
PackageInfo info = manager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
if (info != null) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
5.WXEntryActivity类,类名必须是WXEntryActivity。包名的后缀必须是.wxapi,下面是分享的代码
package com.example.weixinsharedemo.wxapi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.example.weixinsharedemo.Constants;
import com.example.weixinsharedemo.R;
import com.example.weixinsharedemo.SystemUtil;
import com.tencent.mm.sdk.openapi.BaseReq;
import com.tencent.mm.sdk.openapi.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.SendMessageToWX;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.mm.sdk.openapi.WXMediaMessage;
import com.tencent.mm.sdk.openapi.WXWebpageObject;
import com.tencent.mm.sdk.platformtools.Util;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
private final String WX_PACKAGE_NAME = "com.tencent.mm";
private IWXAPI api;
private TextView fenxiang;
private boolean result;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.example.weixinsharedemo.Constants;
import com.example.weixinsharedemo.R;
import com.example.weixinsharedemo.SystemUtil;
import com.tencent.mm.sdk.openapi.BaseReq;
import com.tencent.mm.sdk.openapi.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.SendMessageToWX;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import com.tencent.mm.sdk.openapi.WXMediaMessage;
import com.tencent.mm.sdk.openapi.WXWebpageObject;
import com.tencent.mm.sdk.platformtools.Util;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
private final String WX_PACKAGE_NAME = "com.tencent.mm";
private IWXAPI api;
private TextView fenxiang;
private boolean result;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weixin);
fenxiang = (TextView) findViewById(R.id.WXshare);
api = WXAPIFactory.createWXAPI(this, Constants.APP_WX_ID, false);
api.handleIntent(getIntent(), this);
api.registerApp(Constants.APP_WX_ID);
result = true;
result = new SystemUtil(WXEntryActivity.this).isInstallWx(WX_PACKAGE_NAME);
fenxiang.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
final int wxSdkVersion = api.getWXAppSupportAPI();
if (result) {
final String[] names = { getString(R.string.weixin_shareFri),
getString(R.string.weixin_shareFriend) };// 列表中显示的内容组成的数组
Dialog alertDialog = new AlertDialog.Builder(WXEntryActivity.this)
.setTitle(getString(R.string.weixin_share))// 对话框标题
.setItems(names, new DialogInterface.OnClickListener() {// 每一条的名称
@Override
public void onClick(DialogInterface dialog, int which) {// 响应点击事件
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "http://user.qzone.qq.com/839773597/infocenter?ptsig=TgOfwQl-TeREr1OiImE7wJB9LqssLgayOXQ7lH-Aa2c_";
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = getString(R.string.app_name);
msg.description = getString(R.string.weixin_description);
Bitmap thumb = BitmapFactory
.decodeResource(getResources(), R.drawable.logo);
msg.thumbData = Util.bmpToByteArray(thumb, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
switch (which) {
case 0:
req.scene = SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);
WXEntryActivity.this.finish();
break;
case 1:
if (wxSdkVersion >= TIMELINE_SUPPORTED_VERSION) {
req.scene = SendMessageToWX.Req.WXSceneTimeline;
api.sendReq(req);
} else {
Toast.makeText(WXEntryActivity.this,
getString(R.string.weixin_uninstalledfriend),
Toast.LENGTH_LONG).show();
}
break;
}
}
}).show();
alertDialog.setCanceledOnTouchOutside(true);
} else {
Toast.makeText(WXEntryActivity.this, getString(R.string.weixin_uninstalled), Toast.LENGTH_LONG)
.show();
WXEntryActivity.this.finish();
}
}
});
}
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
// android:exported="true" 可以被其它程序调用
int resultview = 0;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
resultview = R.string.errcode_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
resultview = R.string.errcode_cancel;
break;
// case BaseResp.ErrCode.ERR_AUTH_DENIED:
// resultview = R.string.errcode_deny;
// break;
default:
resultview = R.string.errcode_unknown;
break;
}
Toast.makeText(this, resultview, Toast.LENGTH_LONG).show();
}
}