美文网首页
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