微信分享到好友或者朋友圈的截屏图片

写了一个Demo,里边的界面不太好看,一部分是我自己PS的,菜鸟PS,但是写的过程中遇到了一些问题,在这里做一遍记录,以便今后查证,代码中做了大量的注释:


重点突出以下几个知识点;

一:跳转传值

intent传值,可以是String/boolean/int/byte[]/对象等,但是第一次遇到传bitmap,就有点蒙了。。。

/**
	 * 跳转传值
	 */
	private void IntentSendActivity() {
		Bitmap bitmap = getBitmapForWindow();
		Intent in = new Intent(MainActivity.this, sendActivity.class);
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		// 对图片进行压缩,到byte输出流当中
		bitmap.compress(Bitmap.CompressFormat.JPEG, 75, out);

		byte[] byteArray = out.toByteArray();
		// 因为Intent接收的时候,有bytearray类型
		in.putExtra("bitmap", byteArray);
		startActivity(in);
	}

注:上边是一个获取系统截屏之后,把这张截屏的图片,用intent传递过去的方法


第二:就是上边说的系统截屏,转换为一个bitmap

	/**
	 * 系统截屏方法
	 * 
	 * @return
	 */
	private Bitmap getBitmapForWindow() {
		View view = getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		view.getMatrix();
		return view.getDrawingCache();
	}


这也是第一次见到,所以记录在此;


第三:调用系统相册的方法;


	/**
	 * 调用图库中图片的各种参数
	 */
	private void bitmapFormTuku() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		// intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
		// "image/*");
		intent.putExtra("crop", true);//设置了参数,就会调用裁剪,如果不设置,就会跳过裁剪的过程。
		intent.putExtra("aspectX", 53);//这个是裁剪时候的 裁剪框的 X 方向的比例。
		intent.putExtra("aspecty", 63);

		intent.putExtra("outputX", 50); // 返回数据的时候的 X 像素大小。
		intent.putExtra("outputY", 100); // 返回的时候 Y 的像素大小。

		intent.putExtra("return-data", true);//是否要返回值。 一般都要
		startActivityForResult(intent, 200);
	}

注:有许多技术点就是这样,感觉好像明白,但真要一步一步的写出来,还真够呛,


第四:就是微信分享(如果用三方集成的,就用三方集成的,这里仅仅是分享到朋友圈和好友,所以用的是微信开发 平台的SKD)

1:要下载一个SDK,得到一个jar,然后把这个jar,拷贝到libs中,还有Bulid path一下

2:注册微信:

/**
	 * 微信注册
	 */
	private void initWIxin() {
		// TODO Auto-generated method stub
		// 通过WXAPIFactory工厂,获得API实例
		api = WXAPIFactory.createWXAPI(this, APP_ID, true);
		// 将应用的APPID注册到微信
		api.registerApp(APP_ID);
	}

3:看官网API文档,有一个分享文字、图片、音频、视频和web五中好像,所以我就单独写了一个图片的分享

/**
	 * 把图片分享到微信好友或者朋友圈的核心代码
	 * 
	 * @param choose
	 */
	private void getWXIshare(boolean choose) {
		// TODO Auto-generated method stub
		// 这里的参数是bitmap对象
		Bitmap bmp = getBitmapForWindow();
		WXImageObject imgObj = new WXImageObject(bmp);

		WXMediaMessage msg = new WXMediaMessage();
		msg.mediaObject = imgObj;

		Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
		bmp.recycle();
		msg.thumbData = Util.bmpToByteArray(thumbBmp, true); // 设置缩略图

		SendMessageToWX.Req req = new SendMessageToWX.Req();
		req.transaction = buildTransaction("img");
		req.message = msg;
		if (choose) {
			req.scene = SendMessageToWX.Req.WXSceneTimeline;
		} else if (!choose) {
			req.scene = SendMessageToWX.Req.WXSceneSession;

		}

		api.sendReq(req);

		finish();

	}

当然直接写这个方法,会有许多报错的地方


这里有一个这个包,和这个方法,也是要写的,并且在Manifest.xml中还有


:当然如果还有错误,或者功能实现不了,就可以下载一个官方的Demo看看,不过他的代码好多的,另外到现在这个Demo,还以有一个Bug,就是分享成功之后,调回来,界面中什么都没有,我尝试者从onPause,和onRestart中,再次SetcontentView,也没有效果,而这种问题,一般在网上还很难查到,谁能解决,请一定告诉我,谢谢。。



下面是mainactivity中主要的代码:

package com.ljg.jierizhufuka.app;

import java.io.ByteArrayOutputStream;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

public class MainActivity extends Activity implements View.OnClickListener,
		IWXAPIEventHandler {
	private ImageView imtouxiang, imperpone, imliaotian;
	private EditText ed;
	
	
	
	private static final String APP_ID = "wxaecebe4a563057f8";
	private IWXAPI api;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		initWIxin();
		initView();
		initEvent();

	}

	/**
	 * 微信注册
	 */
	private void initWIxin() {
		// TODO Auto-generated method stub
		// 通过WXAPIFactory工厂,获得API实例
		api = WXAPIFactory.createWXAPI(this, APP_ID, true);
		// 将应用的APPID注册到微信
		api.registerApp(APP_ID);
	}

	// 答:android:cursorVisible="true"//显示
	// android:cursorVisible="false"//隐藏
	private void initEvent() {
		// TODO Auto-generated method stub
		imtouxiang.setOnClickListener(this);
		imperpone.setOnClickListener(this);
		imliaotian.setOnClickListener(this);
		ed.setOnClickListener(this);
		// buzhaoxiang.setOnClickListener(this);
		// buxiangce.setOnClickListener(this);

	}

	private void initView() {
		// TODO Auto-generated method stub
		imtouxiang = mfindViewById(R.id.id_main_touxiang);
		imperpone = mfindViewById(R.id.id_main_perpone);
		imliaotian = mfindViewById(R.id.id_main_liaotian);
		ed = mfindViewById(R.id.id_main_edit);

	
	}

	private <T extends View> T mfindViewById(int ViewId) {
		View v = findViewById(ViewId);
		return (T) v;
	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		switch (arg0.getId()) {
		case R.id.id_main_touxiang:

			bitmapFormTuku();
			break;

		case R.id.id_main_perpone:
			// 异常光标
			ed.setCursorVisible(true);
			imperpone.setVisibility(View.GONE);
			imliaotian.setVisibility(View.GONE);
			// 跳转到第二个界面
			// IntentSendActivity();

			// 跳转到微信
			getWXIshare(true);

			imperpone.setVisibility(View.VISIBLE);
			imliaotian.setVisibility(View.VISIBLE);
			break;

		case R.id.id_main_liaotian:
			imperpone.setVisibility(View.GONE);
			imliaotian.setVisibility(View.GONE);

			getWXIshare(false);

			imperpone.setVisibility(View.VISIBLE);
			imliaotian.setVisibility(View.VISIBLE);
			break;

		case R.id.id_main_edit:
			ed.setCursorVisible(false);
			break;
		default:
			break;
		}
	}

	/**
	 * 系统拍照
	 */
	private void bitmapFormPaiShe() {
		// TODO Auto-generated method stub

	}

	/**
	 * 调用图库中图片的各种参数
	 */
	private void bitmapFormTuku() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		// intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
		// "image/*");
		intent.putExtra("crop", true);//设置了参数,就会调用裁剪,如果不设置,就会跳过裁剪的过程。
		intent.putExtra("aspectX", 53);//这个是裁剪时候的 裁剪框的 X 方向的比例。
		intent.putExtra("aspecty", 63);

		intent.putExtra("outputX", 50); // 返回数据的时候的 X 像素大小。
		intent.putExtra("outputY", 100); // 返回的时候 Y 的像素大小。

		intent.putExtra("return-data", true);//是否要返回值。 一般都要。我第一次忘加了,总是取得空值,囧!
		startActivityForResult(intent, 200);
	}

	/**
	 * 把图片分享到微信好友或者朋友圈的核心代码
	 * 
	 * @param choose
	 */
	private void getWXIshare(boolean choose) {
		// TODO Auto-generated method stub
		// 这里的参数是bitmap对象
		Bitmap bmp = getBitmapForWindow();
		WXImageObject imgObj = new WXImageObject(bmp);

		WXMediaMessage msg = new WXMediaMessage();
		msg.mediaObject = imgObj;

		Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
		bmp.recycle();
		msg.thumbData = Util.bmpToByteArray(thumbBmp, true); // 设置缩略图

		SendMessageToWX.Req req = new SendMessageToWX.Req();
		req.transaction = buildTransaction("img");
		req.message = msg;
		if (choose) {
			req.scene = SendMessageToWX.Req.WXSceneTimeline;
		} else if (!choose) {
			req.scene = SendMessageToWX.Req.WXSceneSession;

		}

		api.sendReq(req);

		finish();

	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
	}
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
	}
	private String buildTransaction(final String type) {
		return (type == null) ? String.valueOf(System.currentTimeMillis())
				: type + System.currentTimeMillis();
	}

	/**
	 * 跳转传值
	 */
	private void IntentSendActivity() {
		Bitmap bitmap = getBitmapForWindow();
		Intent in = new Intent(MainActivity.this, sendActivity.class);
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		// 对图片进行压缩,到byte输出流当中
		bitmap.compress(Bitmap.CompressFormat.JPEG, 75, out);

		byte[] byteArray = out.toByteArray();
		// 因为Intent接收的时候,有bytearray类型
		in.putExtra("bitmap", byteArray);
		startActivity(in);
	}

	/**
	 * 系统截屏方法
	 * 
	 * @return
	 */
	private Bitmap getBitmapForWindow() {
		View view = getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		view.getMatrix();
		return view.getDrawingCache();
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);

		if (resultCode == RESULT_OK && requestCode == 200) {
			Uri uri = data.getData();

			if (data != null) {
				imtouxiang.setImageURI(uri);
			}

		}

	}

	// 微信发送请求到第三方应用时,会回调到该方法
	@Override
	public void onReq(BaseReq req) {
		// switch (req.getType()) {
		// case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
		// goToGetMsg();
		// break;
		// case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
		// goToShowMsg((ShowMessageFromWX.Req) req);
		// break;
		// default:
		// break;
		// }
	}

	// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
	@Override
	public void onResp(BaseResp resp) {
		int result = 0;

		switch (resp.errCode) {
		case BaseResp.ErrCode.ERR_OK:
			result = R.string.errcode_success;
			break;
		case BaseResp.ErrCode.ERR_USER_CANCEL:
			result = R.string.errcode_cancel;
			break;
		case BaseResp.ErrCode.ERR_AUTH_DENIED:
			result = R.string.errcode_deny;
			break;
		default:
			result = R.string.errcode_unknown;
			break;
		}

		Toast.makeText(this, result, Toast.LENGTH_LONG).show();
	}

	/**
	 * Android中 调用图库选择图片的参数详解
	 * 
	 * Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
	 * intent.setType("image/*"); //这个参数是确定要选择的内容为图片,
	 * intent.putExtra("crop", "circle"); //设置了参数,就会调用裁剪,如果不设置,就会跳过裁剪的过程。
	 * intent.putExtra("aspectX", 33); //这个是裁剪时候的 裁剪框的 X 方向的比例。
	 *  intent.putExtra("aspectY",43); //同上Y 方向的比例.(注意: aspectX, aspectY ,两个值都需要为 整数,如果有一个为浮点数,就会导致比例失效。)
	 *  //设置aspectX 与 aspectY 后,裁剪框会按照所指定的比例出现,放大缩小都不会更改。如果不指定,那么 裁剪框就可以随意调整了。
	 * intent.putExtra("outputX", 50); //返回数据的时候的 X 像素大小。
	 * intent.putExtra("outputY", 100); //返回的时候 Y 的像素大小。
	 * //以上两个值,设置之后会按照两个值生成一个Bitmap, 两个值就是这个bitmap的横向和纵向的像素值,如果裁剪的图像和这个像素值不符合,那么空白部分以黑色填充。
	 * intent.putExtra("noFaceDetection", true); // 是否去除面部检测, 如果你需要特定的比例去裁剪图片,那么这个一定要去掉,因为它会破坏掉特定的比例。
	 * intent.putExtra("return-data",* true); //是否要返回值。 一般都要。我第一次忘加了,总是取得空值,囧!
	 * startActivityForResult(intent, * 1);
	 */

}

点击下载源码:http://download.csdn.net/detail/jiajia1112223/9444863

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值