解决
我使用一个字节作为int返回类型,并且在错误的时刻投射,请参阅我的答案。
原始问题
是否允许读取DCIM / Camera文件夹中的文件?我试图在外部存储器中的许多地方进行读写,但除了读取从该文件夹中拍摄的照片(我已经能够写入)之外,它还可以工作。
我的安装eclipse可能不是编译最新版本的源码的问题,但我现在想要解决这个问题。我已经尝试删除并再次添加权限WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE而没有运气。可能是我应该用其他访问方式来完成我不知道因为我从未尝试过阅读这些图片。
我正在尝试阅读的图片与genymotion的虚拟相机一样长达7900字节。当我读它时,我或者只获得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);
}
清单
<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>
我做错了什么?
答案 0 :(得分:1)
几个小时后,我的头撞在屏幕上,我看到了问题。我使用错误的数据类型并在错误的时间进行投射。编码太多,所以很少关注。一些新鲜空气和第二双眼睛帮助发现了傻瓜:)
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...
}