美文网首页
cocoscreator上传头像Android

cocoscreator上传头像Android

作者: 神大人korose | 来源:发表于2020-01-16 11:07 被阅读0次

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);
        }
    },

相关文章

网友评论

      本文标题:cocoscreator上传头像Android

      本文链接:https://www.haomeiwen.com/subject/bqlfzctx.html