2014-06-23 8 views
2

SOLVEDlecture du dossier DCIM de l'appareil photo ne fonctionne pas

j'utilisais un octet pour un type de retour int et casting aussi dans le mauvais moment, voir ma réponse.

question originale

Est-il permis de lire les fichiers dans le dossier DCIM/caméra? J'ai essayé de lire et écrire dans beaucoup d'endroits dans le stockage externe et cela fonctionne, excepté lire les images prises de ce dossier (j'ai pu écrire).

Peut-être que c'est un problème avec mon installation d'eclipse ne compilant pas la dernière version des sources, mais je suis comme fou en ce moment en essayant de comprendre. J'ai essayé de supprimer et d'ajouter à nouveau les autorisations WRITE_EXTERNAL_STORAGE et READ_EXTERNAL_STORAGE sans succès. Peut être son supposé être fait avec un autre moyen d'accès je ne sais pas parce que je n'ai jamais essayé de lire ces images.

L'image que j'essaie de lire fait exactement 7900 octets de long pris avec la caméra virtuelle de genymotion. Quand je le lis, je n'ai que 4 octets ou 0 (atteindre la fin du fichier), mais pas une seule exception ou erreur sur logcat.

Ce code passe bien dans une suite de test pour tout endroit, sauf les images dans DCIM/caméra

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

<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> 

Qu'est-ce que je fais mal?

Répondre

1

Après quelques heures à briser ma tête contre l'écran, j'ai vu le problème. J'utilisais le mauvais type de données et le casting au mauvais moment. Trop de temps à coder, si peu de concentration. Un peu d'air frais et une seconde paire d'yeux ont aidé à découvrir la gaffe :)

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... 

} 
Questions connexes