这两天我们游戏里面用到的了玩家自定义头像这部分,我就研究了下(其实我是一个小白的),现在做个笔记,也和大家分享以下经验。

好了废话少说我就直接贴代码了,嘎嘎。

创建了一个类 ChooseImage  ,

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;

public class ChooseImage {
 
 private static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;// 从sd卡得到图像的请求码
 private static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;// 从相机得到图像的请求码
 private static final int REQUEST_CODE_GETIMAGE_SCREENSHOT = 2;// 截取成功的请求码


 private static Activity mContext;   //avtivity 的对象  因为的我们游戏里面就一个继承了Cocos2dxActivity的avtivity 

 private static int imageOutputX = 168;
 private static int imageOutputY = 168;
 //初始化
 public static void init( Activity con ){
  mContext = con;
  }
 //degbug
 public static void showTip(String str) {
  Log.e("image", "showTip:" + str);
 }
 
 //
 public static void onActivityResult(int requestCode, int resultCode, Intent data) {
  showTip("回调");
  if (requestCode == REQUEST_CODE_GETIMAGE_BYSDCARD) {
   showTip("sd");
   if (data != null) {
    Uri selectedImage = data.getData();
    if (selectedImage != null) {

     startPhotoZoom(selectedImage);//截取
    }
   }
  }
  // 拍摄
  else if (requestCode == REQUEST_CODE_GETIMAGE_BYCAMERA) {
   if (resultCode != 1) {
   return;
 }
  File picture = new File(Environment.getExternalStorageDirectory()
     + "/temp.jpg"); 
   startPhotoZoom(Uri.fromFile(picture));//截取
  }
        else if (requestCode == REQUEST_CODE_GETIMAGE_SCREENSHOT) {
         showTip("截取成功2");
         Bundle extras = data.getExtras();
   if (extras != null) {
             Bitmap bmp = data.getParcelableExtra("data");
    saveBitmapFile(bmp);
   }
    
  }
 }
 //保存  成功之后并发送给quick cocos 中
 public static void saveBitmapFile(Bitmap mBitmap){
  
  String strDir = mContext.getFilesDir().getAbsolutePath();//获取游戏缓存路径
  String strFileName = "tmp/"+String.valueOf(System.currentTimeMillis()) + ".png"; //图片名字
  String strImagePath = strDir + "/res/" + strFileName;
 
  
  showTip( "saveBitmapFile to:"+strImagePath);
  
  File f = new File(strImagePath);
  if(!f.getParentFile().exists()){   //判断路径是否存在 不存在则创建
   f.getParentFile().mkdirs();  
  }
  
  try {
     f.createNewFile();
    } catch (IOException e) {
  }
  
  FileOutputStream fOut = null;
  try {
   fOut = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
     e.printStackTrace();
  }
  mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
  try {
     fOut.flush();
  } catch (IOException e) {
     e.printStackTrace();
  }
  
  try {
     fOut.close();
     showTip( "saveBitmapFile ok:"+strImagePath);

     //图片保存成功,回调游戏里面的全局函数  **注 callLuaGlobalFunctionWithString 参数1 必须是全局函数,不了解的同学可以度娘以下,在这就不详细说了。
     Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("onImageGet", strImagePath);
    } catch (IOException e) {
     e.printStackTrace();
  }
  }

 // 手机选图   
 public static void mobileImage()    //该函数是我在游戏里面调的  , 大家可以视自己情况做不同的操作
 {
  showTip("手机图片");
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  mContext.startActivityForResult(intent,REQUEST_CODE_GETIMAGE_BYSDCARD);
 }
 //拍照
 public static void photograph()  //该函数是我在游戏里面调的
 {
  Intent intentC = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  intentC.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
    Environment.getExternalStorageDirectory(), "temp.jpg")));
  mContext.startActivityForResult(intentC, REQUEST_CODE_GETIMAGE_BYCAMERA);
 }
 //设置截图的宽高
 public static void setScreenshotSize(final int tempX,final int tempY) //该函数是我在游戏里面调的 ,为了设置截取图片的大小
 {
  imageOutputX = tempX;
  imageOutputY = tempY;
 }
 //截图   android自带的
 public static void startPhotoZoom(Uri uri) {
  showTip("图片path        "+uri);
  Intent intent = new Intent("com.android.camera.action.CROP");
  intent.setDataAndType(uri, "image/*");
  intent.putExtra("crop", "true");
  // aspectX aspectY 是宽高的比例
  intent.putExtra("aspectX", 1);
  intent.putExtra("aspectY", 1);
  // outputX outputY 是裁剪图片宽高
  intent.putExtra("outputX", imageOutputX);
  intent.putExtra("outputY", imageOutputY);
  intent.putExtra("return-data", true);
  mContext.startActivityForResult(intent, REQUEST_CODE_GETIMAGE_SCREENSHOT);   //其实第二个参数是为了onActivityResult中用,相当于一个标识
 }
 
}

因为我们调用了android的系统头像,和用到了照相功能,在AndroidManifest.xml中添加权限

                    
还有在saveBitmapFile 中我们操作添加了文件也到添加权限  
    

 

 关于Lua 与 Java 互操作的内容大家可以参考http://blog.csdn.net/wang85632968/article/details/8977457


以下是效果图,

更多相关文章

  1. Android(安卓)EventBus使用
  2. android viewflipper和tabhost效率对比
  3. Timber 源码解析
  4. 【尚观】Android游戏与应用开发最佳学习之路_转载来学习Android
  5. Android(安卓)在低版本sdk中没有getSupportedPreviewSizes和getS
  6. Android下可用的wide char 函数库
  7. android: Can't create handler inside thread that has not cal
  8. 关于Android(安卓)Settings中的八个问题
  9. Android使用Intent返回上一个Activity时StackOverflowError

随机推荐

  1. Android之自定义View
  2. Android之简单的拍照功能
  3. android dialog样式
  4. Android(安卓)RadioGroup RadioButton 自
  5. 【Android】Face Recognition on Android
  6. Android7.0中文文档(API)-- ZoomButtonsCon
  7. Android(安卓)TabHost详解
  8. 小程序分享到朋友圈功能灰度测试!5 个小程
  9. Android(安卓)RecyclerView ItemDecorati
  10. android 判断网络状态