2011-06-06 123 views
13

我知道我的問題是this questionthis one的重複。但是,我仍然有一些問題,所以不要試圖關閉或降低我的問題朋友。請完整地回答這個問題。Android設備特定的相機路徑問題

在我的應用程序中,我想將圖像存儲到設備本機Camera存儲它們的相同文件夾中。根據我的研究,我發現每臺設備都將圖像存儲爲不同的名稱和不同的文件夾。

即:

  • 的Nexus-One將其相機中的文件到一個名爲Camera(/ SD卡/ DCIM /攝像機)文件夾中。

  • 所有HTC設備的相機文件存儲到一個名爲100MEDIA(/ SD卡/ DCIM/100MEDIA)的文件夾。

  • 索尼Xperia X10的存儲它的攝像頭文件到名爲100ANDRO(/ SD卡/ DCIM/100ANDRO)的文件夾。

  • 摩托羅拉MilesStone將其相機文件存儲在名爲Camera(/ sdcard/DCIM/Camera)的文件夾中。

,所以我想知道這是否是編程可能,這樣我可以存儲從我的應用程序帶到同一位置的圖像,以獲得這條道路?

當我用谷歌搜索時,發現最好創建一個我自己的外部文件夾,這樣我就可以用我指定的名稱在該路徑中存儲圖像。之後,在API版本3(Android 1.5)的HTC設備中,我發現只有該文件夾正在創建,但圖像被保存在其默認位置,並具有自己的名稱。

如何解決這個問題?是不是可以找到爲每個設備保存的圖像的具體路徑和名稱?請幫助我的朋友。

+0

我認爲所有「近期」手機(v4.0 +)都使用「Camera」文件夾。 – 2014-02-26 17:39:01

+0

@ AlikElzin-kilaka我的xperia z3和z5都v5.1.1商店在DCIM/100ANDRO FYI – 2016-01-18 01:50:00

回答

4

如果API級別低於7,則使用getExternalStorageDirectory(),然後追加/圖片以獲取照片存儲的路徑。

API等級> 7使用getExternalStoragePublicDirectory(DIRECTORY_PICTURES)。

+0

對不起,我不能理解你能解釋一些代碼plzzzzz – 2011-06-06 08:55:22

+1

請參閱http://developer.android.com/ guide/topics/data/data-storage.html - >保存共享文件。 – 2011-06-06 09:30:54

+0

但圖片/ - 所有照片(不包括使用相機拍攝的照片)。 – degratnik 2012-01-30 10:36:06

3

我用下面的代碼

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

其中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); 
} 

編輯:可惜的是,在上面的方法可能並不總是工作:(...

最後我做手工檢查:

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

這是我正在使用的功能。它並沒有專門命名100Media或Camera目錄。它只是在/ DCIM文件夾中開始並查看其子項。如果孩子不是。縮略圖目錄(或者,取決於你在做什麼),然後看看它的孩子並得到它們。它也在/ DCIM目錄中獲取圖片。

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()); 
       } 
      } 
     } 
    } 

我一直在尋找這個問題的解決方案,我自己。由於不同的製造商對照相機文件夾有不同的命名約定,這似乎涵蓋了所有最佳的地面。它對我很好。