cocos android 打开相机,相册并裁剪

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);
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值