关于LibGDX:如何在屏幕上显示设备中的相机拍摄照片
解决LibGDX加载外部存储相机照片的问题
嘿,我来帮你搞定这个显示设备中图片的问题!你的代码里首先有个明显的语法错误,另外还有权限和路径使用的细节需要注意,一步步来:
1. 修正代码里的语法错误
你原来的代码把两个字符串错误拼接在一起,这会直接导致编译失败:
// 错误写法:字符串拼接逻辑混乱 image = new Texture(Gdx.files.external("badlogic.jpg""/storage/emulated/0/DCIM/Camera/IMG_20180501_155027.jpg"));
正确的写法是直接传入目标图片的路径,而且LibGDX的Gdx.files.external()方法本身就指向外部存储的根目录(也就是/storage/emulated/0/),所以路径可以简化:
Texture image; try { FileHandle file = Gdx.files.external("DCIM/Camera/IMG_20180501_155027.jpg"); if (file.exists() && file.canRead()) { image = new Texture(file); } else { // 文件不存在/不可读时,加载assets里的默认图兜底 image = new Texture(Gdx.files.internal("badlogic.jpg")); } } catch (Exception e) { e.printStackTrace(); // 加载异常时同样兜底 image = new Texture(Gdx.files.internal("badlogic.jpg")); }
2. 解决Android权限问题
这是最容易被忽略的关键!如果是在Android平台运行,必须申请读取外部存储的权限:
- 静态权限声明(AndroidManifest.xml):在
AndroidManifest.xml的<manifest>标签内添加:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 10及以上,添加这个属性兼容旧文件访问逻辑 --> <application android:requestLegacyExternalStorage="true" ...> ... </application> - 动态权限申请(Android 6.0+):API 23及以上系统需要在运行时请求权限,可以在LibGDX的
AndroidLauncher里添加逻辑:
记得处理权限申请的回调,确保用户授权后再尝试加载图片。@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 检查并申请读取权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); // 自定义请求码 } // 初始化LibGDX视图 initialize(new MyGdxGame(), config); }
3. 遵守LibGDX的线程限制
Texture的创建必须在GL线程中进行,如果是在后台线程加载图片,需要用Gdx.app.postRunnable()切换到GL线程:
Gdx.app.postRunnable(() -> { try { image = new Texture(Gdx.files.external("DCIM/Camera/IMG_20180501_155027.jpg")); } catch (Exception e) { e.printStackTrace(); image = new Texture(Gdx.files.internal("badlogic.jpg")); } });
额外小建议
- 相机拍摄的照片通常尺寸较大,加载后可以设置纹理过滤优化显示:
image.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); - 如果是Android 11及以上系统,
requestLegacyExternalStorage的兼容方式可能逐渐受限,长期来看建议通过MediaStore查询图片,而不是直接硬编码文件路径。
内容的提问来源于stack exchange,提问作者余梓揚
相关产品推荐
相关产品推荐

