cocos android 打开相机,相册并裁剪
来源:互联网 发布:将数据保存到文件中 编辑:程序博客网 时间:2024/05/17 04:35
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); } }); }}
阅读全文
0 0
- cocos android 打开相机,相册并裁剪
- 打开相册/相机 并裁剪
- Android 调用相机、打开相册、裁剪图片
- android打开相册选取图片或打开相机拍照并进行裁剪
- Android-打开相册或拍照并裁剪
- Android打开系统相机、相册,并进行裁剪图片的工具类CameraUtil,以及相册获取图片注意要点。
- Android调用相册或相机拍照选取照片并裁剪
- Android从相机、相册选择图片并裁剪
- Android选取相机、相册图片进行裁剪,并更新UI
- Android调用相册或相机拍照选取照片并裁剪
- Android 从相机或相册获取图片并裁剪
- Android调用相册或相机拍照选取照片并裁剪
- Android选择图片(从相册或相机)并裁剪
- Android 打开相机,相册
- Android调用相机实现拍照并裁剪图片,调用手机中的相册图片并裁剪图片
- 跳转相机相册并进行裁剪
- Android 打开相机和图库获取图片并裁剪
- Android笔记(14)打开相机和图库并裁剪
- 牧场上的草泥马(游荡的奶牛)
- mvp封装的OKhttp
- springmvc + AOP 获取Controller HttpServletRequest及HttpServletResponse
- 分享18个常用的网站性能测试工具
- php中使用mb_strlen解决中文字符数
- cocos android 打开相机,相册并裁剪
- A Cookbook for Machine Learning: Vol 1
- ASP.NET MVC
- STM32:利用VM8978和I2S实现录音的频率分析
- Linux下用 lsof 命令查找指定端口被哪个进程占用
- YxImage 图像处理库
- Unsupported method: BaseConfig.getApplicationIdSuffix()
- css-绝对定位
- 数据库索引介绍