写了一个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 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