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
原创粉丝点击