我的申请是做什么的:
1-用户可以通过设备相机拍照。的 (作品)
2-应用程序使用以下文件夹创建一个新文件(使用以下文件夹进行测试以确保它正确保存文件):
a. File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "images");
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName + ".jpg");
b. File mediaStorageDir = new File(Gdx.files.getExternalStoragePath().toString());
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName+".jpg");
c. File mediaStorageDir = new File(Gdx.files.getLocalStoragePath().toString());
- File mediaFile = new File(mediaStorageDir.getPath()+File.separator+fileName+".jpg");
3-应用程序使用bmp.compress(质量= 25)将图片重新缩放+压缩到1024x512,然后保存。的 (作品)
public boolean compressToFile(byte[] data, int quality, File fileHandle) {
File mediaFile = fileHandle;
Pixmap pixmap = new Pixmap(data, 0, data.length);
if(quality<0)
quality = 0;
if(quality>100)
quality = 100;
FileOutputStream fos;
int x=0,y=0;
int xl=0,yl=0;
try {
Bitmap bmp = Bitmap.createBitmap(pixmap.getWidth(), pixmap.getHeight(), Bitmap.Config.ARGB_8888);
// we need to switch between LibGDX RGBA format to Android ARGB format
for (x=0,xl=pixmap.getWidth(); x<xl;x++) {
for (y=0,yl=pixmap.getHeight(); y<yl;y++) {
int color = pixmap.getPixel(x, y);
// RGBA => ARGB
int RGB = color >> 8;
int A = (color & 0x000000ff) << 24;
int ARGB = A | RGB;
bmp.setPixel(x, y, ARGB);
}
}
fos = new FileOutputStream(mediaFile, false);
boolean compressed = bmp.compress(CompressFormat.JPEG, quality, fos);
if(compressed)
System.out.println("zgzg2020:: compressed SUCCESS!");
else
System.out.println("zgzg2020:: compressed FAILED!");
fos.close();
int WIDTH = 1024, HEIGHT = 512;
File f = mediaFile;
Bitmap shrunkBmp = downsizeImage(f, WIDTH, HEIGHT);
fos = new FileOutputStream(mediaFile, false);
shrunkBmp.compress(CompressFormat.JPEG, 100, fos);
fos.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return false;
}
缩小。
public Bitmap downsizeImage(File file, int width, int height) {
BitmapFactory.Options opts = new BitmapFactory.Options ();
opts.inSampleSize = 2; // for 1/2 the image to be loaded
Bitmap thumb = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(file.getPath(), opts), width, height, false);
return thumb;
}
4-确认jpg已正确保存。我已经测试了以上三条路径。
System.out.println("b4 pictureFile= " + file.getPath().toString() + "=> " + file.exists());//Returns false.
compressToFile(data, quality, file);//Here is where the compression, scale down, write to disk.
System.out.println("af pictureFile= " + file.getPath().toString() + "=> " + file.exists());//Returns true
5-读取保存的图片并在屏幕上呈现。 应用程序崩溃了!!!
mode = Mode.render;
System.out.println("AssessPath:"+file.toString());//to confirm the path
texture = new Texture(file.toString());//(FAILS!!)
错误
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file
备注:
我在两台机器上测试了我的应用程序,Marshmallow,Lollipop。两者都失败并出现相同的错误。
权限似乎正确:
在计算机上保存文件后,我手动将文件复制到资源文件夹中。该应用程序能够打开该文件;所以我确信该文件符合LibGDX分辨率......等要求。
我搜索了很多文章和问题/答案,找不到问题的原因:
https://github.com/libgdx/libgdx/wiki/File-handling#writing-to-a-file
https://github.com/libgdx/libgdx/wiki/Integrating-libgdx-and-the-device-camera
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: - Error
答案 0 :(得分:1)
我正在使用platform specific code执行此操作。该接口用于核心代码。
public interface GalleryOpener {
void openGallery();
String getSelectedImagePath();
}
这是android上的实现。
public class AndroidLauncher extends AndroidApplication implements GalleryOpener {
public static final int SELECT_IMAGE_CODE = 1;
private String selectedImagePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
initialize(new GreenWall(this), config);
}
@Override
public GalleryOpener galleryOpener() {
return this;
}
@Override
public void openGallery() {
selectedImagePath = null;
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Image"), SELECT_IMAGE_CODE);
}
@Override
public String getSelectedImagePath() {
return selectedImagePath;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == SELECT_IMAGE_CODE) {
Uri imageUri = data.getData();
selectedImagePath = getPath(imageUri);
}
//super.onActivityResult(requestCode, resultCode, data);
}
private String getPath(Uri uri) {
if (uri.getScheme().equalsIgnoreCase("file")) {
return uri.getPath();
}
Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
if (cursor == null) {
return null;
}
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String filePath = cursor.getString(column_index);
cursor.close();
return filePath;
}
}
使用它可以看起来像这样:
galleryOpener.openGallery();
String selectedImagePath = galleryOpener.getSelectedImagePath();
if (selectedImagePath != null) {
FileHandle fileHandle = Gdx.files.absolute(selectedImagePath);
Texture texture = new Texture(fileHandle);
}