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”,它将成为某些设备的内部存储器。
非常感谢您的投入!!
答案 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模块并进一步解决这个问题。