JAVA代码
package org.cocos2dx.javascript;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
public class ImagePicker{
public static final int NONE = 0;
public static final int PHOTOHRAPH = 1; // 拍照
public static final int PHOTOZOOM = 2; // 缩放
public static final int PHOTORESOULT = 3; // 结果
public static final String IMAGE_UNSPECIFIED = "image/*";
private static int mScreenWidth = 128; // default texture width
private static int mScreenHeight = 128; // default texture height
private static int mScreenQuality = 75; // default texture quality
private static File tempFile;
private static ImagePicker instance = null;
private static AppActivity activity = null;
private static String tempImg = "slg_temp_corp.jpg";
private Uri uritempFile = null ;
public static ImagePicker getInstance(){
if(instance == null){
instance = new ImagePicker();
}
return instance;
}
//初始化
public void init(AppActivity activity){
ImagePicker.activity = activity;
}
//打开相册
static public void openPhoto(int width, int height, int quality){
System.out.println("打开相册 ---- ");
mScreenWidth = width;
mScreenHeight = height;
mScreenQuality = quality;
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
activity.startActivityForResult(intent, PHOTOZOOM);
}
//使用相机
static public void openCamera(int width, int height, int quality){
System.out.println("使用相机 ---- ");
mScreenWidth = width;
mScreenHeight = height;
mScreenQuality = quality;
// //用于保存调用相机拍照后所生成的文件
tempFile = new File(Environment.getExternalStorageDirectory().getPath(), System.currentTimeMillis() + ".jpg");
// //跳转到调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//判断版本
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //如果在Android7.0以上,使用FileProvider获取Uri
// intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Uri contentUri = FileProvider.getUriForFile(activity.getApplicationContext(), "org.unreal.update", tempFile);
// intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
// } else { //否则使用Uri.fromFile(file)方法获取Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
//}
activity.startActivityForResult(intent, PHOTOHRAPH);
// final Intent intentPhote = new Intent();
// final Intent intent_camera = context.getPackageManager()
// .getLaunchIntentForPackage("com.android.camera");
// if (intent_camera != null) {
// intentPhote.setPackage("com.android.camera");
// }
// intentPhote.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
// File out = new File(getPhotopath(context));
// Uri uri = Uri.fromFile(out);
// 获取拍照后未压缩的原图片,并保存在uri路径中
// intentPhote.putExtra(MediaStore.EXTRA_OUTPUT, uri);
// activity.startActivityForResult(intentPhote, PHOTOHRAPH);
// ((Activity) context).startActivityForResult(intentPhote, Constants.REQUEST_CODE_CAPTURE_CAMEIA);
}
//回调
public void onActivityResult(int requestCode, int resultCode, Intent data){
System.out.println("回调 "+requestCode+"-------"+resultCode+"--------"+data);
if (resultCode == NONE && requestCode != PHOTORESOULT)
return;
//拍照
if (requestCode == PHOTOHRAPH) {
System.out.println("拍照 ---- ");
startPhotoZoom(Uri.fromFile(tempFile));
}
if (data == null)
return;
//读取相册图片
if (requestCode == PHOTOZOOM) {
System.out.println("读取相册图片 ---- ");
startPhotoZoom(data.getData());
// Uri uri = data.getData();
// String type = data.getType();
// if (uri.toString().contains("com.miui.gallery.open")) {
// uri = getImageContentUri(activity, new File(getRealFilePath(activity, uri)));
// }
// startPhotoZoom(uri);
}
//处理结果
if (requestCode == PHOTORESOULT) {
// uritempFile = data.getData();
Bitmap bitmap = null;
System.out.println("裁剪返回 uritempFile ---- " + uritempFile);
if (uritempFile == null) {
System.out.println("111 ---- " + uritempFile);
Bundle extras = data.getExtras();
bitmap = extras.getParcelable("data");
}else{
try {
System.out.println("222 ---- " + uritempFile);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
options.inPurgeable = true;
options.inInputShareable = true;
bitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uritempFile),null, options);
} catch (FileNotFoundException e) {
System.out.println("333 ---- " + uritempFile);
e.printStackTrace();
}
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
System.out.println("裁剪返回 bitmap ---- " + bitmap);
bitmap.compress(Bitmap.CompressFormat.JPEG, mScreenQuality, stream);
byte[] appicon = stream.toByteArray();
String paramString = "playerIconLayerObtainTextureBase64String('" + Base64.encodeToString(appicon, Base64.NO_WRAP) + "')";
//调JS 返回 base64 string
this.sendCloseGamera(paramString);
}
}
public void startPhotoZoom(Uri uri) {
// Uri outputUri = Uri.fromFile(tempFile);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX,aspectY 是宽高的比例,这里设置正方形
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//设置要裁剪的宽高
intent.putExtra("outputX", mScreenWidth);
intent.putExtra("outputY", mScreenHeight);
//压缩图片
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
//如果图片过大,会导致oom,这里设置为false
// try {
intent.putExtra("return-data", true);
// } catch() {
// e.printStackTrace();
//uri = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
// }
// if (uri != null) {
// intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
// }
if (uri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
activity.startActivityForResult(intent, PHOTORESOULT);
}
public void sendCloseGamera (final String evalStr){
activity.runOnGLThread(new Runnable() {
@Override
public void run() {
System.out.println("调JS 返回 "+evalStr);
Cocos2dxJavascriptJavaBridge.evalString(evalStr);
System.out.println("调JS 返回 123456789");
}
});
}
/**
* 将URI转为图片的路径
*
* @param context
* @param uri
* @return
*/
public static String getRealFilePath(final Context context, final Uri uri) {
if (null == uri)
return null;
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri,
new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ",
new String[]{filePath}, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
}
js调用方法
self.headImage.node.width为裁剪宽度,
self.headImage.node.height为裁剪高度,
// 分平台 调用 访问相册
onVisitPhoto : function (self) {
if (cc.sys.os === cc.sys.OS_ANDROID) {
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/ImagePicker", "openPhoto",
"(III)V", self.headImage.node.width, self.headImage.node.height, 80);
}
},
// 分平台 调用 使用相机
onUseCamera : function (self) {
if (cc.sys.os === cc.sys.OS_ANDROID) {
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/ImagePicker", "openCamera",
"(III)V", self.headImage.node.width, self.headImage.node.height, 80);
}
},
网友评论