cocos creator 读取android相册并显示

前言

由于功能需求,需要读取手机相册的图片并在游戏中加载出来,百度了很多,也遇到了许多坑,下面这个是比较简单的,需要的自取。

cocos 调用原生

getImgPath() {
               //这个是带参数的 
               //"org/cocos2dx/javascript/AppActivity" 原生方法所在的类路径
               //"getImgData" 原生方法名
               //"(Ljava/lang/String;)V" 方法签名
               //'' 参数
               //还不懂得就去看看 https://docs.cocos.com/creator/manual/zh/advanced-topics/java-reflection.html?h=jsb.reflection.callstaticmethod
               jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getImgPath", "(Ljava/lang/String;)V", '');
               //这个是不带参数的,根据需要自己选择
               jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getImgPath", "()V")
    }

android

android 读取相册需要授权,所以要现在 AndroidManifest.xml 里加上权限

 <!-- 手机内置存储读取权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 手机内置存储写入权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA" />

然后在 AppActivity 内实例化刚写的方法

//有参数的记得接过来
public static void getImgPath () {
    Intent intent_album = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    app.startActivityForResult(intent_album, 2);
}

接下来找到这个方法

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
}

在里面写

 if (data != null) {
            // 得到图片的全路径写法,可以copy
            Uri uri = data.getData();
            String[] filePathColumns = { MediaStore.Images.Media.DATA };
            Cursor c = getContentResolver().query(uri, filePathColumns, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePathColumns[0]);
            String imagePath = c.getString(columnIndex);    
            //app = this 自己记得设置变量赋值
            app.runOnGLThread(new Runnable() {
                    @Override
                    public void run(){
                    Cocos2dxJavascriptJavaBridge.evalString("cc.find('Canvas/Test').getComponent('Test').showImg(" + imagePath + ");");
                    }
                });

}

在cocos内显示图片

有了路径显示就很简单了,我在这有个坑爬了两天,是引入upng-js 库和 jpeg-js 库一直报错,我看的方法是说用 jsb.fileUtils.getDataFromFile(path) 这个方法去读图片数据,但这个方法返回的数据不是像素信息,而是格式化后的,需要解码,而解码就需要引入upng-js 库和 jpeg-js 库,但我一引入就报错,不引入就没法解码,也查找了报错的解决办法,有的说是node.js版本问题,有的说是方法问题,但都没用,最后才发现,这个好像是个路径,可以直接用的!!!

showImg(path){
          cc.loader.load({url: path, type: 'jpg'}, function(err,img){
                    this.sprite.spriteFrame = new cc.SpriteFrame(img);
                });
}

就这一行代码坑了我两天,我真是有 橘麻麦皮 不知当讲不当讲!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐