读取分区/目录/存储/ extSdCard作为文件,逐字节。 Android的

时间:2015-01-25 15:17:49

标签: java android file directory partition

我遇到了这个代码的问题,该代码正在使用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"/>

1 个答案:

答案 0 :(得分:0)

我不确定您是否会在没有root的标准Android应用中获得此类访问权限 - 有几点需要考虑:

  1. Android为您提供应用程序的文件系统访问权限 - 而不是对分区的原始访问权限。
  2. 您通常需要卸载分区/文件系统 因为您不希望获得任何权限,所以逐字节访问 你的方式,你只能以root用户身份卸载。
  3. 如果您是root用户,则可以卸载该驱动器,然后发出一个 dd命令用于创建带有原始图像的新文件 像:

    Runtime.getRuntime()。exec(&#34; su -c dd if = / dev / deviceToRead1&gt; of = rawOutputFile&#34;);

  4. 我可以告诉你,如果可以从非root设备获得,那么它将被处理 作为一个安全漏洞,它将尽快修补 将整个手机及其上的所有数据置于危险之中。如果这 可以从非root设备那里获得 任何从其他应用程序窃取/读取数据的应用程序 Android特别以各种方式限制。

  5. Google Play可能会阻止此行为 验证过程,如果您打算将此应用程序放入Google中 玩商店因为它被认为是恶意的。

  6. 我还可以告诉你,如果你能找到一种方法来实现这一目标,那么它将需要 一个将为您提供root权限的漏洞利用程序一旦你有了root (通过漏洞利用)然后其余的很容易用基本的命令行 实用程序(mountdd,具体而言)。

  7. 从商业角度来看,如果这可能是你的应用程序 把法医软件搞砸了:)请记住法医 完成此过程的软件也需要原始访问权限 需要物理访问设备和/或的分区 设备上的root访问权限。

  8. 你得到java.io.FileNotFoundException的原因是 因为您使用的API可以在文件系统级别上进行访问 您需要的是绕过文件系统功能。你会 永远不会使用文件系统调用对分区进行原始访问。

  9. 我认为此列表可以回答您的问题。如果没有先获得root权限,你将无法做到这一点,否则Android的整个安全模型将被证明是无用的。