2

SDカードにファイルを作成/保存しています。これはコードです:

File sdDir = Environment.getExternalStorageDirectory();
public void btnsave_clicked(View v) throws FileNotFoundException, IOException{
     File f;
      f=new File(sdDir, "deposit.dma");
      if(!f.exists())
      f.createNewFile();
...
}

しかし、ボタンをクリックすると、「許可が拒否されました」とスローされます。追加の使用許可を私に求めないでください。

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

これは既にマニフェストに追加しています。

私は何をすべきか?LogCat 情報:

10-19 20:25:14.681: E/AndroidRuntime(29016): FATAL EXCEPTION: main
10-19 20:25:14.681: E/AndroidRuntime(29016): java.lang.IllegalStateException: Could not execute method of the activity
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$1.onClick(View.java:2168)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View.performClick(View.java:2552)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$PerformClick.run(View.java:9229)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Handler.handleCallback(Handler.java:587)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.os.Looper.loop(Looper.java:130)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.app.ActivityThread.main(ActivityThread.java:3701)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invoke(Method.java:507)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at dalvik.system.NativeStart.main(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016): Caused by: java.lang.reflect.InvocationTargetException
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invokeNative(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.lang.reflect.Method.invoke(Method.java:507)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at android.view.View$1.onClick(View.java:2163)
10-19 20:25:14.681: E/AndroidRuntime(29016):    ... 11 more
10-19 20:25:14.681: E/AndroidRuntime(29016): Caused by: java.io.IOException: Permission denied
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.io.File.createNewFileImpl(Native Method)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at java.io.File.createNewFile(File.java:1257)
10-19 20:25:14.681: E/AndroidRuntime(29016):    at org.brotheroftux.depositmaster.MainActivity.btnsave_clicked(MainActivity.java:43)
10-19 20:25:14.681: E/AndroidRuntime(29016):    ... 14 more
4

2 に答える 2

5

Android環境のドキュメントから

ユーザーのルート名前空間の汚染を避けるために、アプリケーションはこの最上位ディレクトリを直接使用しないでください。アプリケーション専用のファイルはすべて、Context.getExternalFilesDir によって返されるディレクトリに配置する必要があります。このディレクトリは、アプリケーションがアンインストールされた場合にシステムによって削除されます。その他の共有ファイルは、getExternalStoragePublicDirectory(String) によって返されるディレクトリの 1 つに配置する必要があります。

言い換えれば、これは実際には良い習慣ではありません (ただし、非常に正当な理由があるかもしれませんが、コンテキストはあまり明確ではありません)。

さらに、Cthulhu と Ted Hopp がコメントしたように、許可がマニフェストの正しい場所にあることを確認してください。

于 2012-10-19T16:34:04.387 に答える
4

一部の SD および MicroSD カードには、書き込み保護スイッチが付いています。持っている場合は、書き込み保護されていないことを確認してください。

また、電話を接続した後、[USB ストレージをオンにする] が選択されていないことを確認してください。これにより、PC からアクセスできるように SD カードがマウントされ、デバイスからの書き込みが無効になります。

これは、通知バーを上から下にスワイプすることで確認できます。私は「USB接続済み」と言っていますが、「USBストレージをオンにする」は有効にしないでください。

于 2012-10-19T16:34:19.813 に答える