在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方法后,都会报错,下面是报错信息:
我自己已经整整3天时间花在这问题上了,也问gpt,也上网查了,但愣是没找到类似的问题。
求解答一下这到底是为啥,如果能顺带说一下怎么解决就更好了。
如果此路不通的话,也请指一条能将远程图片保存到安卓相册的明路。
(ps:第一次提问不知道这样对不对)
首先确定你是否有足够的权限来写入图片到目录,其次确定你要保存图片的目录是否存在,没有的话先创建目录,然后再保存图片,或者是你的图片文件名中包含了非法字符,例如冒号、斜杠等,你排查下
报错原因是文件夹目录没找到,你把那个生成的目录打印一下,日志输出关键信息
访问相册需要申请权限的