Cocos creator 2制作的app里关于保存图片到本地的错误(java.io.IOException: No such file or directory)

在cocos creator 2.4.11用ts编写了一个保存远程图片到本地的方法,如下:

    SaveToLocal(textureUrl: string) {
      const fileName = 'textureName';
      const fileType = '.jpeg';
      let filePath: string = null;
    
      cc.assetManager.loadRemote(textureUrl, { ext: '.jpeg' }, (err, textureAsset) => {
        if (err) {
          console.error('Error loading remote texture:', err);
          return;
        }
    
        const texture = textureAsset as cc.Texture2D;
    
        const width = texture.width;
        const height = texture.height;
        
        const xhr = new XMLHttpRequest();
        xhr.onreadystatechange = () => {
          if (xhr.readyState === 4 && xhr.status === 200) {
            if (xhr.response && cc.sys.isNative) {
              const rootPath = jsb.fileUtils.getWritablePath();
              filePath = rootPath + fileName + fileType;
              const u8a = new Uint8Array(xhr.response);
              jsb.fileUtils.writeDataToFile(u8a, filePath);
              console.log(filePath);
              // 保存成功后调用 saveImageToGallery 方法
              jsb.reflection.callStaticMethod(
                'org.saver.imageSaver',
                'saveImageToGallery',
                '(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V',
                filePath,
                width.toString(),
                height.toString()
              );
            }
          }
        };
        xhr.responseType = 'arraybuffer';
        xhr.open('GET', textureUrl, true);
        xhr.send();
      });
    }

按照预想他会把远程图片保存到本地后调用原生插件(应该是这个叫法吧我刚学)
imageSaver 这个 java方法会把图片存到安卓本地相册里。
(ps:最近刚学,代码基本都是gpt写的,但都基本理解是干嘛的)


package org.saver;

import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

import com.context.get.AndroidBridge;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class imageSaver {
    public static void saveImageToGallery(String imagePath, String widthStr, String heightStr) {
        // 将宽度和高度参数转换为整数类型
        Log.e("saving","1");
        int width = Integer.parseInt(widthStr);
        int height = Integer.parseInt(heightStr);

        Log.e("saving","2");
        // 创建保存图片的目录
        File directory = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyGallery");

        // 如果目录不存在,则创建它
//        Log.e("saving","3");
//        if (!directory.exists()) {
//            Log.e("saving","4");
//            if (!directory.mkdirs()) {
//                Log.e("saving",directory.getAbsolutePath());
//                // 目录创建失败
//                return;
//            }
//        }

        try {
            // 创建一个随机的文件名
            Log.e("saving","6");
            String fileName = "image_" + System.currentTimeMillis() + ".jpeg";
            Log.e("saving","7");
            // 创建保存图片的文件
            File file = new File(directory, fileName);

            // 创建保存图片的文件
            if (!file.exists()) {
                if (file.createNewFile()) {
                    // 从Cocos Creator传入的图片路径复制到Java可以访问的位置
                    File srcFile = new File(imagePath);

                    if (srcFile.exists()) {
                        FileOutputStream outputStream = new FileOutputStream(file);
                        byte[] buffer = new byte[1024];
                        int length;

                        // 使用文件流将图片复制到新的位置
                        FileInputStream inputStream = new FileInputStream(srcFile);
                        while ((length = inputStream.read(buffer)) > 0) {
                            outputStream.write(buffer, 0, length);
                        }
                        inputStream.close();

                        outputStream.flush();
                        outputStream.close();

                        // 刷新媒体库
                        Context context = AndroidBridge.getAppContext();

                        // 插入图片到媒体库
                        ContentValues values = new ContentValues();
                        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
                        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
                        Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                        // 扫描文件
                        MediaScannerConnection.scanFile(context,
                                new String[]{file.getAbsolutePath()}, null,
                                new MediaScannerConnection.OnScanCompletedListener() {
                                    public void onScanCompleted(String path, Uri uri) {
                                        Log.e("saving","comp");
                                    }
                                });
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

呃,代码大概就这样,每次调用Cocos creator中的SaveToLocal方法后,都会报错,下面是报错信息:

img

我自己已经整整3天时间花在这问题上了,也问gpt,也上网查了,但愣是没找到类似的问题。

求解答一下这到底是为啥,如果能顺带说一下怎么解决就更好了。

如果此路不通的话,也请指一条能将远程图片保存到安卓相册的明路。
(ps:第一次提问不知道这样对不对)

首先确定你是否有足够的权限来写入图片到目录,其次确定你要保存图片的目录是否存在,没有的话先创建目录,然后再保存图片,或者是你的图片文件名中包含了非法字符,例如冒号、斜杠等,你排查下

报错原因是文件夹目录没找到,你把那个生成的目录打印一下,日志输出关键信息

访问相册需要申请权限的