1. 程式人生 > >微信分享到好友或者朋友圈的截圖圖片

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

寫了一個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