【问题标题】:Cant write nor read to/from external storage with LibGDX无法使用 LibGDX 写入或读取外部存储
【发布时间】:2016-02-13 13:51:10
【问题描述】:

我的create 方法如下所示:

@Override
public void create () {
    batch = new SpriteBatch();

    FileHandle file = Gdx.files.external("file.txt");
    file.writeString("My god, it's full of stars", false);
}

我还包括:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

我得到的例外是:

02-13 14:45:51.858 12439-12466/com.snowdevs.tweetiebirds E/AndroidRuntime: FATAL EXCEPTION: GLThread 1120
Process: com.snowdevs.tweetiebirds, PID: 12439
com.badlogic.gdx.utils.GdxRuntimeException: Error writing file: file.txt (External)
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:353)
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:339)
    at com.snowdevs.tweetiebirds.TweetieBirdsGame.create(TweetieBirdsGame.java:22)
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:254)
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1519)
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
 Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error writing file: file.txt (External)
    at com.badlogic.gdx.files.FileHandle.writer(FileHandle.java:330)
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:350)
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:339) 
    at com.snowdevs.tweetiebirds.TweetieBirdsGame.create(TweetieBirdsGame.java:22) 
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:254) 
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1519) 
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
 Caused by: java.io.FileNotFoundException: /storage/emulated/0/file.txt: open failed: EACCES (Permission denied)
    at libcore.io.IoBridge.open(IoBridge.java:452)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
    at com.badlogic.gdx.files.FileHandle.writer(FileHandle.java:322)
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:350) 
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:339) 
    at com.snowdevs.tweetiebirds.TweetieBirdsGame.create(TweetieBirdsGame.java:22) 
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:254) 
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1519) 
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
 Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
    at libcore.io.Posix.open(Native Method)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
    at libcore.io.IoBridge.open(IoBridge.java:438)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
    at com.badlogic.gdx.files.FileHandle.writer(FileHandle.java:322) 
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:350) 
    at com.badlogic.gdx.files.FileHandle.writeString(FileHandle.java:339) 
    at com.snowdevs.tweetiebirds.TweetieBirdsGame.create(TweetieBirdsGame.java:22) 
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:254) 
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1519) 
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

我使用带有 Android 6 Marshmallow 的 Nexus 5 进行测试。 我搜索并发现 Android 6 使用 Run Time Permissions,但 LibGDX 开发人员说它甚至可以在 Android 6 上运行。是否有修复,无论是否有 Run Time Permissions?

【问题讨论】:

    标签: android file libgdx


    【解决方案1】:

    我有同样的情况(Android 6,Nexus 4 没有 SD 卡,libGDX 1.9.3):
    我用

    检查了外部存储
    Gdx.files.isExternalStorageAvailable() // returns true
    

    然后获取文件句柄

    FileHandle file = Gdx.files.external("file.txt"); // no exception
    

    然后调用

    file.writeString("text",false); // throws GdxRuntimeException
    

    所以我在android端检查了这段代码是否真的可以使用外部存储:

    Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); // returns true
    

    这也返回了 true。所以这不是 libGDX 问题,而是 Android 问题。

    然后我通过捕获异常并在这种情况下将文件写入本地存储来解决它。

    【讨论】:

      【解决方案2】:

      我通过检查用户是否已授予外部存储权限并通过使用请求权限来解决问题:

                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                      if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                           this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_REQUEST_CODE);
                  }
      

      所有这些都是 android 特定的代码,因此驻留在 AndroidLauncher 类中。

      【讨论】:

        【解决方案3】:

        我认为 Nexus 5 没有外部存储设备(SD 卡)。

        用这个来测试一下 -

        boolean isExtAvailable = Gdx.files.isExternalStorageAvailable();
        

        您可以找到更多信息here

        【讨论】:

          猜你喜欢
          • 2012-10-12
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          • 2021-02-06
          • 2023-02-13
          • 2012-08-11
          • 2016-10-27
          相关资源
          最近更新 更多