2012-02-13 79 views
1

我有一个装有Android 4.0的Samsung Nexus S设备。我试图在SD卡上的现有文件夹中创建一个文件,并获得“拒绝权限”。在下面的代码中,exists()返回true,但canWrite()返回false。为什么?Samsung Nexus S android 4.0:无法在SD卡中创建文件dir

File exst = Environment.getExternalStorageDirectory(); 
    String exstPath = exst.getPath(); 


       File d = new File(exstPath+"/TestDir/"); 
       if (!d.exists()) 
       { 
        int b = 1; 
       } 
       if (!d.canWrite()) 
       { 
        int a = 1; 
       } 

顺便说一下,我已将<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />添加到清单,但没有帮助。

回答

0

手机是否插入电脑?如果是这样,电脑将控制SD卡并且不允许它被写入。如果是这种情况,请尝试将连接模式更改为“仅收费”。

+0

我认为它在4.0上有点不同于2.3。当我连接时,它不提供“PC模式”,“USB存储”,“仅充电”等4个选项。它只是询问我是否要打开或关闭USB存储。我将一些文件复制到SD卡上,为此我必须打开USB存储设备。然后我关闭它,以便能够从我的PC启动和调试我的应用程序。 – 2012-02-13 21:29:39

0

追加getAbsolutePath()到您的第一线,那么它应该工作:

File exst = Environment.getExternalStorageDirectory().getAbsolutePath(); 

更新:

回顾我自己的代码和其他SO答案,我相信你不使用canWrite检查一个路径可以在SD卡上写入。而是使用Environment.MEDIA_MOUNTED:

String state = Environment.getExternalStorageState(); 
if (Environment.MEDIA_MOUNTED.equals(state)) { 
    Log.d("Test", "sdcard mounted and writable"); 
} 
else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
    Log.d("Test", "sdcard mounted readonly"); 
} 
else { 
    Log.d("Test", "sdcard state: " + state); 
} 
+0

尝试过,结果相同 – 2012-02-14 02:47:38

+0

已更新的答案。还要确保WRITE_EXTERNAL_STORAGE权限位于清单文件的正确部分。 – 2012-02-14 22:35:41

0

尽管所有的答案给出部分建议,这个问题很可能三星非标准的API实现

String myPath = Environment.getExternalStorageDirectory().getAbsolutePath ; 
    // or .getName() or .getPath() <-- these don't return everything you need. 
    // same is true for the file version you're trying. 

    // you have to append 

“/ external_sd /”

到文件名前面的路径。

下面是三星的解释

http://developer.samsung.com/forum/board/thread/view.do?boardName=GeneralB&messageId=162934&messageNumber=1381&startId=zzzzz~&searchType=TITLE&searchText=sdcard

它也是在几个SO帖子中提到的API他们的“破”,但我没有方便的链接...

  • H

[编辑于2013年5月中旬]以下是此问题的病理情况:您可以通过各种常规方法获取path()被提及。然后,只需编写一个简单的文件并观看它显示在DDMS文件浏览器中。尝试对确切的路径和文件名进行硬编码或使用/ external_sd/thing--在这两种情况下,您将无法再读取自己的文件! (或者你可能会,但它会包含垃圾。)我们已经在三种不同的S3手机上验证了这一点。将通过RemoteTestingLab网站在三星“真实”手机上进行更多测试并回报。