package org.cocos2dx.javascript;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.graphics.Bitmap;
import android.content.Intent;
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 ImagePicker instance = null;
public static native void onImageSaved(String path);
private Uri photoUri;
private String picPath = null;
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() {
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() {
/**
* 由于Camara返回的是缩略图,我们可以传递给他一个参数EXTRA_OUTPUT,
* 来将用Camera获取到的图片存储在一个指定的URI位置处。 下面就指定image存储在SDCard上,并且文件名为123.jpg
* imageFilePath = Environment.getExternalStorageDirectory().
* getAbsolutePath()+"123.jpg"; File file = new File(imageFilePath);
* //创建一个文件 Uri imageUri = Uri.fromFile(file);
* 然而Android已经提供了一个多媒体库,那里统一存放了设备上所有的多媒体数据。所以, 我们可以将获取到的图片存放在那个多媒体库中。
* Android提供了MediaStore类,该类是一个ContentProvider,管理着设备上自带的和外部的多媒体文件,
* 同时包含着每一个多媒体文件的数据信息。 为了将数据存储在多媒体库,使用ContentResolver对象来操纵MediaStore对象
* 在MediaStore.Images.Media中有两个URI常量,一个是 EXTERNAL_CONTENT_URI,
* 另一个是INTERNAL_CONTENT_URI 第一个URI对应着外部设备(SDCard),第二个URI对应着系统设备内部存储位置。
* 对于多媒体文件,一般比较大,我们选择外部存储方式
* 通过使用ContentResolver对象的insert方法我们可以向MediaStore中插入一条数据
* 这样在检索那张图片的时候,不再使用文件的路径,而是根据insert数据时返回的URI,获取一个InputStream
* 并传给BitmapFactory
*/
File cameraCacheImg = new File(Environment
.getExternalStorageDirectory().getAbsolutePath(),
"text.jpg");
try {
// 文件cameraCache.jpg是否存在
if (cameraCacheImg.exists()) {
// 文件删除
cameraCacheImg.delete();
}
//
cameraCacheImg.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
// 启动相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraCacheImg));
activity.startActivityForResult(intent, PHOTOHRAPH);
// 需要返回数据或结果的,
// 则使用startActivityForResult (Intent intent, intrequestCode),requestCode
// 的值是自定义的,用于识别跳转的目标Activity。
}
// 为了获取Camera返回的图片信息,重写该方法
public void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("onActivityResult --------------- " + requestCode);
if (resultCode == NONE)
return;
switch (requestCode) {
case PHOTOHRAPH: // 照相机
File picture = new File(Environment.getExternalStorageDirectory(),
"text.jpg");
startCameraZoom(Uri.fromFile(picture));
break;
case PHOTOZOOM: //从相册选取
if (data == null){
this.sendCloseGamera(-1, "");
return;
}
startPhotoZoom(data.getData());
break;
case PHOTORESOULT:
if (data == null){
this.sendCloseGamera(-1, "");
return;
}
Bitmap bitmap = null;
System.out.println("裁剪返回 uritempFile ---- " + uritempFile);
if (uritempFile == null) {
Bundle extras = data.getExtras();
bitmap = extras.getParcelable("data");
}else{
try{
bitmap =BitmapFactory.decodeStream(activity.getContentResolver()
.openInputStream(uritempFile));
}catch (Exception e) {
// TODO: handle exception
}
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream);
// XXX/@ci_1111-1111-1111-1111.jpg
String path = "/" + UUID.randomUUID().toString() + ".jpg";
String savaPath = activity.getFilesDir() + path;
//其会创建data/data/packagename/files 文件夹
saveMyBitmap(savaPath, bitmap);
this.sendCloseGamera(1, path);
uritempFile = null;
break;
}
}
//从相机返回调用
public void startCameraZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
intent.putExtra("crop", "true"); // 发送裁剪信号
intent.putExtra("aspectX", 1); // 方向上的比例
intent.putExtra("aspectY", 1); // 方向上的比例
intent.putExtra("outputX", 640); // 裁剪区的宽
intent.putExtra("outputY", 640); // 裁剪区的高
intent.putExtra("return-data", true); // 是否将数据保留在Bitmap中返回
activity.startActivityForResult(intent, PHOTORESOULT);
}
//从相册返回调用
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
intent.putExtra("crop", "true"); // 发送裁剪信号
intent.putExtra("aspectX", 1); // 方向上的比例
intent.putExtra("aspectY", 1); // 方向上的比例
intent.putExtra("outputX", 640); // 裁剪区的宽
intent.putExtra("outputY", 640); // 裁剪区的高
//测试时 裁剪返回app报错 因为两个activity通讯过大 就会导致崩溃 返回失败 打开相册和打开相机就分开调用
//intent.putExtra("return-data", true); // 是否将数据保留在Bitmap中返回
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
activity.startActivityForResult(intent, PHOTORESOULT);
}
public void saveMyBitmap(String filePath, Bitmap mBitmap) {
File f = new File(filePath);
try {
f.createNewFile();
} catch (IOException e) {
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.JPEG, 70, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendCloseGamera (final int requestCode,final String path){
activity.runOnGLThread(new Runnable() {
@Override
public void run() {
String evalStr = "js方法-----("+ requestCode + ", \"" + path + "\")";
System.out.println("sendCloseGamera -= "+evalStr);
Cocos2dxJavascriptJavaBridge.evalString(evalStr);
}
});
}
}
cocos android 打开相机,相册并裁剪
最新推荐文章于 2024-06-19 16:39:37 发布