我遇到了这个代码的问题,该代码正在使用sdcard连接的Windows机器上工作,但是不能在android上工作。有谁知道如何逐字节地读取SD卡作为单个文件?我想从分区读取所有字节。
public void buttonOnClick(View v) throws IOException {
//File diskRoot = new File("\\\\.\\G:"); // for Windows disk ex. G
int off=0;
int len=1024;
FileInputStream stream = null;
//TODO find direct access to sd card
//File sdDir = new File("storage/extSdCard");
File sdDir = new File("storage/extSdCard");
//File sdDir = new File("dev/block/platform/s3c-sdhci.2/mmcblk1");
//File sdDir = Environment.getExternalStorageDirectory();
//FileInputStream asd = openFileInput(Environment.getExternalStorageState());
//File sdDir = new File(Environment.getExternalStorageDirectory()); gives internal storage of device
//sdDir.getParentFile().mkdirs();
//File file = new File(sdDir,"");
byte[] buffer = new byte[1024];
try {
stream = new FileInputStream(sdDir);
while (stream.read(buffer, off, len) != -1) {
//
}
stream.close();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
任何评论的上述版本的"文件sdDir"在logcat中给出相同的输出:
01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ java.io.FileNotFoundException: /storage/extSdCard: open failed: EISDIR (Is a directory) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:416) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at java.io.FileInputStream.(FileInputStream.java:78) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at raf.test.MBR.buttonOnClick(MBR.java:77) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.view.View$1.onClick(View.java:3719) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.view.View.performClick(View.java:4261) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.view.View$PerformClick.run(View.java:17356) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:615) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.os.Looper.loop(Looper.java:137) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4921) 01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ at dalvik.system.NativeStart.main(Native Method) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:405) 01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ ... 16 more
Permisions是:
<uses-permission android:name="android.permission.read_external_storage"/>
<uses-permission android:name="android.permission.write_external_storage"/>
答案 0 :(得分:0)
我不确定您是否会在没有root的标准Android应用中获得此类访问权限 - 有几点需要考虑:
如果您是root用户,则可以卸载该驱动器,然后发出一个
dd
命令用于创建带有原始图像的新文件
像:
Runtime.getRuntime()。exec(&#34; su -c dd if = / dev / deviceToRead1&gt; of = rawOutputFile&#34;);
我可以告诉你,如果可以从非root设备获得,那么它将被处理 作为一个安全漏洞,它将尽快修补 将整个手机及其上的所有数据置于危险之中。如果这 可以从非root设备那里获得 任何从其他应用程序窃取/读取数据的应用程序 Android特别以各种方式限制。
Google Play可能会阻止此行为 验证过程,如果您打算将此应用程序放入Google中 玩商店因为它被认为是恶意的。
我还可以告诉你,如果你能找到一种方法来实现这一目标,那么它将需要
一个将为您提供root权限的漏洞利用程序一旦你有了root
(通过漏洞利用)然后其余的很容易用基本的命令行
实用程序(mount
和dd
,具体而言)。
从商业角度来看,如果这可能是你的应用程序 把法医软件搞砸了:)请记住法医 完成此过程的软件也需要原始访问权限 需要物理访问设备和/或的分区 设备上的root访问权限。
你得到java.io.FileNotFoundException
的原因是
因为您使用的API可以在文件系统级别上进行访问
您需要的是绕过文件系统功能。你会
永远不会使用文件系统调用对分区进行原始访问。
我认为此列表可以回答您的问题。如果没有先获得root权限,你将无法做到这一点,否则Android的整个安全模型将被证明是无用的。