2013-01-08 35 views
2

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

在我的应用程序需要将数据写入到外置SD卡。然而,这在一些设备上工作,但是在其他一些设备上失败 。 例如 作品:Limebox内部闪存,SD卡,Android操作系统:2.3.3 三星SD卡,extSdcard,Android操作系统:4.0.3

失败:Leoxys SD卡,extsd Android操作系统:4.0.3

如何找到动态的Android兼容设备,例如 ,它们允许外部SD卡写入操作。 myfile.canWrite

详情: 的getExternalSD()是一个用户定义的功能,其将返回外部SD卡路径

在我的情况外部SD卡路径是“/ MNT/extSdcard”(或)“/ MNT/extsd” 我通过阅读文件中查找外部SD卡路径‘/system/etc/vold.fstab’

下面是一些代码片段:它会在外部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完全兼容? b。为什么在不同的硬件设备上有不同的行为。这与固件有关吗?
c。有没有其他方法可以在这种硬件上实现写入?

我alreday尝试下/系统的/ etc/premissions /使用终端模拟器 修改文件“platform.xml”的权限,但我不能写模式

默认情况下,Android提供环境中打开该文件。 getEnternalStorageDirectory()。 但库返回“到/ mnt/SD卡”,这将是在一些器件中的内部存储器。

您的意见将不胜感激!

回答

1

你的问题B:因为(不幸)仍有在Android上没有真正的标准化,API可能因制造商各不相同,你可以经常面临着特殊的设备问题。一个很好的例子是在Samsung 2.3.x设备上返回null的getData()方法。

Environment.getEnternalStorageDirectory() - 我想这将返回内部存储器目录只在没有SD卡的设备上,所以我没有看到问题。尽管权限提供

+0

其实,即使有一个SD卡 – TimothyP

1

File.canWrite()返回在某些设备上假。

这是因为没有您正在尝试执行的操作的权限。

在我的应用程序需要将数据写入到外置SD卡

Android应用程序不一定能够获得“外置SD卡”。并非所有设备即使都有“外部SD卡”。因此,你的“需求”是有缺陷的,需要被替换。

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

你没有。

在我的情况外部SD卡路径是 “/ MNT/extSdcard”(或) “的/ mnt/extsd”

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

我通过阅读文件“/system/etc/vold.fstab”

也就是说增量比随机猜测更好地找到外接SD卡路径,但你超出的范围顺利Android SDK。

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

当然。

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

这会返回一个指向File外部存储 - 什么样的用户将有机会获得,如果它们连接的设备和主机之间的USB电缆和安装外部存储的驱动器或卷。

a。是否有任何API可让开发人员知道设备是否与Android完全兼容?

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

为什么在不同的硬件设备上有不同的行为。

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

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

没什么可靠的。只需使用官方的外部存储(例如getExternalFilesDir())。或者,建立你自己的ROM模组,你可以控制什么非标准挂载点的条款以及他们的读/写权限是什么,并且在你希望和可以使用的任何设备上使用该ROM模块。

+0

Environment.getEnternalStorageDirectory(这将返回上像迈乐A1000和Cubieboard设备内部SD)是没用的,在我们把它返回内部SD相当多的设备。我遇到与原始海报相同的问题。针对特定客户的定制应用程序(不适用于Android手机或平板电脑,但是是特定设备),无法写入任何附加存储设备(而其他应用程序可以) – TimothyP

+0

@TimothyP:然后与制造商联系“非常具体的设备”,并*问他们*做什么。有问题的制造商不太可能会注意到您的StackOverflow注释,因此我建议您打电话给他们或使用他们现有的客户支持机制。 – CommonsWare

+0

许多设备不能正确返回信息,单个设备就是一个例子,只是指出'Environment.getEnternalStorageDirectory()“实际上是不可靠的。 – TimothyP

1

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

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

有问题的Android应用程序是针对特定需求的定制应用程序,而不是 意图是典型的Android Market应用程式。这个应用程序从网络服务器 获取数据并将其存储到外部Sdcard。由于数据很大,手机内存太小,相当于 。

没什么可靠的。只需使用官方的外部存储(例如getExternalFilesDir())。或者,建立你自己的ROM模组,你可以控制什么非标准挂载点的条款以及他们的读/写权限是什么,并且在你希望和可以使用的任何设备上使用该ROM模块。

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

相关问题