2

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

在我的应用程序中,我需要将数据写入外部 SD 卡。然而,这在某些设备上有效,但在其他一些设备上失败。例如作品:Limebox Internal Flash, SDCard, android OS: 2.3.3 Samsung Sdcard, extSdcard, android OS: 4.0.3

失败:Leoxys sdcard,extsd android OS:4.0.3

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

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

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

这是一些代码片段:它在外部 sdcard 中创建一个文件夹。在某些设备上,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"/>

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

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

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

您的意见将不胜感激!

4

3 回答 3

3

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

那是因为您尝试做的事情没有许可。

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

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

如何动态找出 Android 兼容设备,即允许外部 SD 卡写入操作的设备。我的文件.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 模块,这样您就可以指定存在哪些非标准挂载点以及它们的读/写权限是什么,并在您希望和可以使用的任何设备上使用该 ROM 模块。

于 2013-01-08T12:51:23.130 回答
1

感谢 Commonsware、Maver1ck 的意见和建议。

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

有问题的 Android 应用程序是针对特定需求的自定义应用程序,并非典型的 android 市场应用程序。此应用程序从网络服务器获取数据并将其存储到外部 SD 卡中。由于数据量很大,手机内存太小了。

没有什么是可靠的。只需使用官方外部存储(例如,getExternalFilesDir())。或者,构建您自己控制的 ROM 模块,这样您就可以指定存在哪些非标准挂载点以及它们的读/写权限是什么,并在您希望和可以使用的任何设备上使用该 ROM 模块。

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

于 2013-01-09T11:08:01.210 回答
1

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

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

于 2013-01-08T12:05:09.283 回答