尽管提供了WRITE_EXTERNAL_STORAGE权限,但File.canWrite()在某些设备上返回false

时间:2013-01-08 10:32:11

标签: java android

File.canWrite()在某些设备上返回false   提供许可。

在我的应用程序中,我需要将数据写入外部SD卡。但是这适用于某些设备但未通过 其他 。 例如 Works:Limebox内置闪存,SD卡,Android操作系统:2.3.3     三星Sdcard,extSdcard,android操作系统:4.0.3

失败:Leoxys sdcard,extsd android OS:4.0.3

如何动态找出Android兼容设备,即 允许外部SD卡写操作。 myfile.canWrite

详情: getExternalSD()是一个用户定义的函数,它将返回外部sdcard路径

在我的情况下,外部Sdcard路径是“/ mnt / extSdcard”(或)“/ mnt / extsd” 我通过读取文件“/system/etc/vold.fstab”找到外部SD卡路径

以下是一些代码片段:它在外部SD卡中创建一个文件夹。 在某些设备上,myfile.canWrite()返回False,我无法创建文件夹。

String sdcardpath = getExternalSD();
    System.out.println("the sdcard path is:"+sdcardpath.trim().toString());
    tv = (TextView) findViewById(R.id.textView1);
    tv.append("the sd card path is:"+sdcardpath);

    File myfile = new File(sdcardpath);
    tv.append("\n the extsd is readable or not:"+myfile.canRead());
    tv.append("\n \n the extsd is writable or not:"+myfile.canWrite());
    if(myfile.canWrite()){
        File testfile = new File(sdcardpath, "test");
        if(testfile.exists()){

        }else{
            boolean mkdir = testtlie.mkdirs();
            if(mkdir == true){
            tv.append("\n\n the path is:"+sdcardpath.trim().toString()+"/myfile");
            }else{
                tv.append("\n File does not have permissions");
            }
        }

    }else{
        System.out.println("the external sd card does not have write permissions");
        tv.append("\n\n the external sd card does not have write permissions");
    }

xml文件片段。

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

我想就建议提出建议 一个。是否有任何api可以让开发人员知道设备是否真的与Android兼容? 湾为什么不同硬件设备上的行为存在差异。这与固件有关吗?
C。有没有其他方法可以在这种硬件上实现写入?

我已经尝试使用终端Emulator修改/ system / etc / premissions /下的文件“platform.xml”的权限 但我无法以写入模式打开文件

默认情况下,android提供了Environment.getEnternalStorageDirectory()。 但是库返回“/ mnt / sdcard”,它将成为某些设备的内部存储器。

非常感谢您的投入!!

3 个答案:

答案 0 :(得分:1)

问题b:因为(不幸的是)Android上仍然没有真正的标准化,API可能因制造商而异,您可能经常面临特定于设备的问题。一个很好的例子是getData()方法,它在Samsung 2.3.x设备上返回null。

Environment.getEnternalStorageDirectory() - 我想这只会在没有SD卡的设备上返回内部存储目录,所以我不会在那里看到问题。

答案 1 :(得分:1)

  

尽管提供了许可,但File.canWrite()在某些设备上返回false。

这是因为你没有获得你想要做的事情的许可。

  

在我的应用程序中,我需要将数据写入外部SD卡

Android应用程序不一定能访问“外部SD卡”。并非所有设备都拥有“外部SD卡”。因此,你的“需要”是有缺陷的,需要更换。

  

如何动态找出Android兼容设备,即允许外部SD卡写入操作。 myfile.canWrite

你没有。

  

在我的情况下,外部Sdcard路径是“/ mnt / extSdcard”(或)“/ mnt / extsd”

对于某些固件版本,某些设备上可能存在这些路径。是否有“外部Sd卡”取决于设备制造商。无论是安装,如果安装,在何时,都取决于设备制造商。权限取决于设备制造商。这些答案可能随时在任何设备上随固件升级而改变。

  

我通过读取文件“/system/etc/vold.fstab”找到外部sdcard路径

这比随机猜测更好,但你远远超出了Android SDK的范围。

  

在某些设备上,myfile.canWrite()返回False,我无法创建文件夹。

当然。

  

默认情况下,android提供了Environment.getEnternalStorageDirectory()。

这将返回指向外部存储的File - 如果用户在设备和主机之间连接USB电缆并将外部存储装载为驱动器或卷,则用户可以访问该内容。

  

一个。是否有任何api可以让开发人员知道设备是否真的与Android兼容?

您要做的不是“真正与Android兼容”。设备很好 - 你的期望不是。请修正你的期望。

  

为什么不同硬件设备的行为存在差异。

任何超出Android SDK范围的内容都取决于设备制造商。他们可以做他们想做的事。

  

有没有其他方法可以在这种硬件上实现写入?

没有什么是可靠的。只需使用官方外部存储(例如,getExternalFilesDir())。或者,构建您自己控制的ROM mod,因此您需要指定存在的非标准安装点的条款以及它们的读/写权限,并在您希望的任何设备上使用该ROM mod。

答案 2 :(得分:1)

感谢Commonsware,Maver1ck提供您的意见和建议。

  

Android应用程序不一定能访问“外部SD卡”。并非所有设备都有“外部SD卡”。因此,你的“需要”是有缺陷的,需要更换

有问题的Android应用是针对特定需求的自定义应用,而不是 打算成为典型的Android市场应用程序。此应用程序从网络服务器获取数据 并将其存储在外部Sdcard上。由于数据是巨大的,手机内存太小 对于相同的。

  

没有什么是可靠的。只需使用官方外部存储(例如,getExternalFilesDir())。或者,构建您自己控制的ROM mod,因此您需要指定存在的非标准安装点的条款以及它们的读/写权限,并在您希望的任何设备上使用该ROM mod。

我将研究ROM模块并进一步解决这个问题。