【问题标题】:Android openFileOutput - no permission to create storageAndroid openFileOutput - 无权创建存储
【发布时间】:2011-06-02 10:28:34
【问题描述】:

我的应用程序中的权限有问题。我的应用似乎没有在存储上创建文件的权限。

String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos;

try 
{
   fos = getApplicationContext()
           .openFileOutput(FILENAME, Context.MODE_PRIVATE);     
   fos.write(string.getBytes());
   fos.close();
}
catch (Exception e)
{
   e.printStackTrace();
}

在我的主类 onCreate 处理程序中,我总是得到:

06-02 13:23:52.996: WARN/ApplicationContext(6278): Unable to create files directory
06-02 13:23:54.203: WARN/System.err(6278): java.lang.NullPointerException
06-02 13:23:54.226: WARN/System.err(6278):     at android.app.ContextImpl.openFileOutput(ContextImpl.java:464)
06-02 13:23:54.234: WARN/ActivityManager(2470): Activity idle timeout for HistoryRecord{485ebe10 com.servision.svclient/.Main}
06-02 13:23:54.257: WARN/System.err(6278):     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
06-02 13:23:54.273: WARN/System.err(6278):     at com.servision.svclient.Main.onCreate(Main.java:59)
06-02 13:23:54.277: WARN/System.err(6278):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-02 13:23:54.285: WARN/System.err(6278):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-02 13:23:54.293: WARN/System.err(6278):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 13:23:54.296: WARN/System.err(6278):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 13:23:54.304: WARN/System.err(6278):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 13:23:54.312: WARN/System.err(6278):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 13:23:54.320: WARN/System.err(6278):     at android.os.Looper.loop(Looper.java:123)
06-02 13:23:54.324: WARN/System.err(6278):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 13:23:54.332: WARN/System.err(6278):     at java.lang.reflect.Method.invokeNative(Native Method)
06-02 13:23:54.336: WARN/System.err(6278):     at java.lang.reflect.Method.invoke(Method.java:521)
06-02 13:23:54.343: WARN/System.err(6278):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
06-02 13:23:54.355: WARN/System.err(6278):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-02 13:23:54.359: WARN/System.err(6278):     at dalvik.system.NativeStart.main(Native Method)

作为回应。

我相信它对我的项目的定义非常简单。但我不知道它是什么。

如果我创建另一个项目并将相同的代码放入其中,它可以正常工作。

我的清单文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.servision.svclient"
      android:versionCode="1"
      android:versionName="1.0">
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />


  <application android:icon="@drawable/main" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".Main" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name=".StreamActivity" android:label="@string/app_name"/>        
    <activity android:name=".MainActivity"/>
    <activity android:name=".GatewayList"/>
    <activity android:name=".StatisticsActivity"/>
    <activity android:name=".SettingsActivity"/>
    <activity android:name=".MapsActivity"/>
    <activity android:name=".AboutActivity"/>
  </application>
  <uses-sdk android:minSdkVersion="8" />


</manifest> 

【问题讨论】:

  • Main.java 的第 59 行是什么
  • 我真的不认为内部存储需要权限。发布的堆栈跟踪是否已满?或者你省略了行。
  • 没有android.permission.WRITE_INTERNAL_STORAGE这样的权限

标签: android file file-io permissions


【解决方案1】:

设备管理 => 设备右键 => 卸载应用 => 重新运行。

【讨论】:

  • 虽然这个想法可能有点随意,但它是一个不错的想法。 “无法创建文件目录”可能是由于设备的已安装应用程序目录与自身不一致而导致的系统级错误,因此删除并重新安装应用程序确实可能是最合适的操作过程。至少看起来问题不在于应用程序本身的代码。
【解决方案2】:

您正在访问的文件是否确实在内部存储中?您尚未声明 WRITE_EXTERNAL_STORAGE 权限。你需要这个来写入 SD 卡

【讨论】:

  • 是的,它没有路径,所以我假设它将在内部存储上创建,即使我添加 WRITE_EXTERNAL_STORAGE ,它仍然无法工作
  • 我通过从设备中手动删除整个应用程序文件夹解决了这个问题。
  • openFileOutput() 返回 internal 存储的路径。
  • openFileOutput() 不需要任何权限来写入或读取文件
【解决方案3】:

您的FILENAME 变量有误:FILENAME 的值是多少?

发生该错误是因为尝试根据您的 FILENAME 变量生成文件会导致 openFileOutput 中出现空值。所以 FILENAME 没有产生一个有效的文件。

【讨论】:

  • FILENAME 的值是“file_ouput”​​,但是如果我把它改成硬编码字符串,比如“test”,没关系,它仍然会失败。
  • 我通过从设备中手动删除整个应用程序文件夹解决了这个问题。
  • 啊,你更改了签名证书吗?如果您使用不同的证书签署应用程序(例如,如果您的调试证书过期并生成新证书,或者如果您使用发布证书),则基础目录的所有权将发生变化。不过,空指针是一个奇怪的错误......
  • 我遇到了同样的问题,无法使用 getFilesDir(),因为它总是返回 null。但是,我能够使用 getDir,但是在尝试写入任何文件时,发生了另一个错误。由于某种原因,该应用程序的文件夹在安装时似乎没有获得正确的权限。请注意,这并没有在我拥有的所有设备上发生,我只能在 G1 上看到,但这足以浪费我两个小时的时间。我也有一个类似的应用程序,它能够毫无问题地使用 getFilesDir,所以我慢慢地找到了这篇文章,其中 AlexS 的评论是解决方案。谢谢!
  • @AlexS:如果您解决了问题,请发布您的解决方案并接受它以关闭问题或删除问题
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多