java - 从 DCIM 相机文件夹中读取不起作用

标签 java android android-camera

已解决

我对 int 返回类型使用了一个字节,并且在错误的时刻进行了转换,请参阅我的回答。

原始问题

是否允许读取文件夹 DCIM/Camera 中的文件?我尝试在外部存储的很多地方进行读写操作,但它可以正常工作,除了读取从该文件夹中拍摄的照片(我已经能够写入)。

可能是我安装的 eclipse 没有编译最新版本的源代码的问题,但我现在正疯狂地试图找出答案。我试过删除并再次添加 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限,但没有成功。可能它应该通过其他我不知道的访问方式来完成,因为我从未尝试阅读那些图片。

我要读取的图片恰好是 7900 字节长,是用 genymotion 的虚拟相机拍摄的。当我阅读它时,我要么只得到 4 个字节,要么得到 0 个字节(到达文件末尾),但 logcat 上没有一个异常或错误。

此代码在除 DCIM/Camera 中的那些图片之外的任何位置的测试套件中运行正常

public void testReadCamera() throws IOException {
        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

        FileInputStream is = new FileInputStream(new File(dir, "Camera/IMG_20140623_125853.jpg"));
        ArrayList<Byte> bytes = new ArrayList<Byte>();
        byte b = 0;
        while((b = (byte) is.read()) != -1) {
            bytes.add(b);
        }
        byte[] data = new byte[bytes.size()];
        for(int i = 0; i < bytes.size(); i++){
            data[i] = bytes.get(i);
        }

        assertEquals(7900, data.length);

}

list

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.adyrsoft.pictures.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.adyrsoft.pictures" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

我做错了什么?

最佳答案

用头撞屏幕几个小时后,我发现了问题所在。我在错误的时间使用了错误的数据类型和转换。编码时间太多,注意力太少。一些新鲜空气和第二双眼睛有助于发现错误 :)

public void testReadCamera() throws IOException {
        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

        FileInputStream is = new FileInputStream(new File(dir, "Camera/IMG_20140623_125853.jpg"));
        ArrayList<Byte> bytes = new ArrayList<Byte>();
        int b = 0; // This has to be an int, return type of FileInputStream.read() is int
        while((b = is.read()) != -1) { // I was casting to byte here... I still wonder why myself...
            bytes.add((byte)b); //Here is where the cast should have been.
        }
        byte[] data = new byte[bytes.size()];
        for(int i = 0; i < bytes.size(); i++){
            data[i] = bytes.get(i);
        }

        assertEquals(file.length(), data.length); // Also...

}

关于java - 从 DCIM 相机文件夹中读取不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24372679/

相关文章:

java - 找不到 apache poi 的类

java - 为什么对象数组中的元素没有更新?

android - 如何获得真实的屏幕高度和宽度?

java - Java.lang.Integer 类型的值 0 无法转换为 JSONObject

android - 如何在 Android 模拟器上从相机捕获照片?

java - 使用 eventBus 从特定 Activity 中清除堆栈 Activity

java - 从 JTree Transferable TransferHandler 复制粘贴

android - 对于 Android,我可以将设置按钮放在选项卡栏而不是工具栏吗?

android - 将视频从安卓相机流式传输到电脑?

android - cwac-相机 : SingleShotMode: picture taken not being showed up on S3 and S4