2011-06-06 21 views
13

Sorunun this question ve kopyalarının olduğunu biliyorum. Ama yine de bazı problemlerim var, bu yüzden sorularımı kapatmaya veya reddetmeye çalışmayın. Lütfen soruyu tamamen gözden geçirin.Android cihaz için özel kamera yolu sorunu

Uygulamamda, görüntüleri yerel Fotoğraf Makinesi cihazlarının sakladığı yerdeki klasöre kaydetmek istiyorum. Araştırmam başına göre, her bir cihazın Görüntüleri farklı bir ada ve farklı klasörde sakladığını öğrendim.

  • Nexus-One Camera(/ sdcard/DCIM/Kamera) adlı bir klasöre onun kamera dosyalarını saklar: is

    .

  • Tüm HTC cihazlar 100MEDIA(/ sdcard/DCIM/100MEDIA) adlı bir klasöre onların kamera dosyalarını depolamak.

  • Sony Xperia x10 100ANDRO(/ sdcard/DCIM/100ANDRO) adlı bir klasöre onun kamera dosyaları depolar.

  • Motorola MilesStone Camera(/ sdcard/DCIM/Kamera) adlı bir klasöre onun kamera dosyaları depolar.

Bu yüzden ben görüntülerin aynı konuma benim app alınan saklayabilir, böylece bu yolu almak için programlı mümkün olmadığını bilmek istedi?

Ben googling yaparken kendimden harici bir klasör oluşturmanın daha iyi olduğunu öğrendim, böylece görüntüleri bu yolla belirttiğim adla depolayabileceğim. Bundan sonra, API sürüm 3'teki (Android 1.5) HTC cihazında, sadece klasörün oluşturulduğunu ancak görüntünün kendi başına bir adla varsayılan yerine kaydedildiğini öğrendim.

Bu sorun nasıl çözülür? Her cihaz için kaydedilen görüntünün belirli yolunu ve adını bulmak mümkün değil mi? Lütfen bana arkadaş edin.

+0

tüm "yeni" telefonlar (v4.0 +) 'Camera' klasörünü kullanmak düşünüyorum. DCIM/100ANDRO içinde AlikElzin-kilaka benim xperia z3 @ –

+0

ve z5 hem v5.1.1 depolar Bilginize –

cevap

4

API düzeyi 7'nin altındaysa getExternalStorageDirectory() öğesini kullanın ve ardından Fotoğraflar depolama alanının yolunu almak için/Pictures'ı ekleyin. API düzeyi> 7 için

, getExternalStoragePublicDirectory (DIRECTORY_PICTURES) kullanın.

+0

i plzzzzz –

+1

http://developer.android.com/ bakın bazı kod ile açıklayabiliriz i anlamak mümkün değilim üzgünüm kılavuz/konular/veri/data-storage.html -> Paylaşılan dosyaları kaydetme. –

+0

Ama Resimler/- (fotoğraf makinesi ile çekilen olanlar hariç) Tüm fotoğraflar. – degratnik

3

Aşağıdaki kodu

String pictures_path = Utils.getRealPathFromURI(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
File path = new File(pictures_path); 
if (path.isFile()) 
    path = path.getParentFile(); 

kullandıkları yer Utils:

public static String getRealPathFromURI(Uri content_uri, int media_type) { 
    String column = MediaType.MEDIA_TYPE_PICTURE;  
    ContentResolver content_resolver = getContext().getContentResolver(); 
    String [] proj = { column }; 
    Cursor cursor = content_resolver.query(content_uri, 
        proj, // Which columns to return 
        null, // WHERE clause; which rows to return (all rows) 
        null, // WHERE clause selection arguments (none) 
        null); // Order-by clause (ascending by name) 
    int column_index = cursor.getColumnIndexOrThrow(column); 
    if (!cursor.moveToFirst()) 
     return null; 
    return cursor.getString(column_index); 
} 

DÜZENLEME: Maalesef, yaklaşım yukarıda hep ... :(çalışmayabilir

Sonunda yaptım manuel kontroller:

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    if (path.exists()) { 
     File test1 = new File(path, "100MEDIA/"); 
     if (test1.exists()) { 
      path = test1; 
     } else { 
      File test2 = new File(path, "100ANDRO/"); 
      if (test2.exists()) { 
       path = test2; 
      } else { 
       File test3 = new File(path, "Camera/"); 
       if (!test3.exists()) { 
        test3.mkdirs(); 
       } 
       path = test3; 
      } 
     } 
    } else { 
     path = new File(path, "Camera/"); 
     path.mkdirs(); 
    } 
2

Kullandığım işlev budur. Özellikle 100Media veya Kamera dizinlerini isimlendirmez. Sadece/DCIM klasöründe başlar ve çocuklarına bakar. Çocuk değilse.küçük resimler dizini (ya da ne yaptığınıza bağlı olarak), daha sonra çocuklarına bakın ve onları alın. Ayrıca/DCIM dizininin kendisinde resimler çeker.

File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    File thumbnails = new File(dcim, "/.thumbnails"); 
    File[] listOfImg = dcim.listFiles(); 
    if (dcim.isDirectory()){ 
     //for each child in DCIM directory 
     for (int i = 0; i < listOfImg.length; ++i){ 
      //no thumbnails 
      if(!listOfImg[i].getAbsolutePath().equals(thumbnails.getAbsolutePath())){ 
       //only get the directory (100MEDIA, Camera, 100ANDRO, and others) 
       if(listOfImg[i].isDirectory()) { 
        //is a parent directory, get children 
        File[] temp = listOfImg[i].listFiles(); 
        for(int j = 0; j < temp.length; ++j) { 
         f.add(temp[j].getAbsolutePath()); 
        } 
       }else if(listOfImg[i].isFile()){ 
        //is not a parent directory, get files 
        f.add(listOfImg[i].getAbsolutePath()); 
       } 
      } 
     } 
    } 

Bu soruna kendim çözüm arıyorum. Farklı üreticiler kamera klasörleri için farklı adlandırma kurallarına sahip olduklarından, bu durum en iyi zemini kapsamaktadır. Benim için gayet iyi çalışıyor.