微信分享到好友或者朋友圈的截圖圖片
寫了一個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