4

写真を撮らずに、カメラの写真の実際のパスを取得したいと思います。

私が今使っているのは:

String path=""; //The real path I want...
String[] projection=new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DATE_TAKEN};     
final Cursor c=context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN+" DESC"); 
if(c!=null)
{
  c.moveToFirst();
  path=c.getString(1);
  Log.i(Constants.TAG, "File Path: "+path);
  path=path.substring(0, path.lastIndexOf('/')+1);
}

しかし、上の結果はいつか変わった...

通常の場合、/storage/ext_sd/DCIM/100MEDIA/になります。

(私は HTC バタフライ、アンドロイド 4.1.1、United Stats で DroidDNA と呼ばれるまったく同じモジュールを使用しています)

今日の午後、写真の一部を別のフォルダーに移動した後 (PC ではなく電話で操作します)

結果は/storage/ext_sd/[some_other_of_my_image_folder]/に変更されました

カメラ写真の実際のパスを取得するにはどうすればよいですか? 私を助けてください :-(

編集:次のような別の方法を試しています:

Log.i(Constants.TAG, "Photo path: "+f.getPath());
if(f.exists())
{
  File test1=new File(f, "100MEDIA/");
  if (test1.exists())
  {f=test1;}
  else
  {
    File test2=new File(f, "100ANDRO/");
    if(test2.exists())
    {f=test2;}
    else
    {
      File test3=new File(f, "Camera/");
      if(!test3.exists())
      {test3.mkdirs();}
      f=test3;
    }
  }
}
else
{
  f=new File(f, "Camera/");
  f.mkdirs();
}

/storage/sdcard0/DCIM/100MEDIA/のようなパスが返されました。これは、私の電話の内部 16GB スペースです。

カメラの写真ストアを外部 microSD に設定済みで、そのパスは/ext_sd/DCIM/100MEDIA/である必要があります。

本当に助けが必要です、MEDIC !

4

1 に答える 1

3

2 人が私の質問に投票したので、おそらく他のプログラマーも同じ問題に直面していると思います。

私はこれを克服する方法を得ました.以下は私のコードです:

String path="";
String[] projection=new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DATE_TAKEN};     
final Cursor c=context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN+" DESC");
boolean isOK=false; //Found a DCIM path ?
if(c!=null)
{
  c.moveToFirst();
  while(!isOK)
  {
    path=c.getString(1);
    Log.i(Constants.TAG, "File Path: "+path);
    path=path.substring(0, path.lastIndexOf('/')+1);
    isOK=!(path.indexOf("DCIM")==-1); //Is thie photo from DCIM folder ?

    c.moveToNext(); //Add this so we don't get an infinite loop if the first image from
                    //the cursor is not from DCIM
  }
}
Log.i(Constants.TAG, "Only Path: "+path);

特急 :

まず、それは私のSDカードです

  • /DCIM/100MEDIA/xxx.JPG (カメラからの写真)
  • /Media/image/comics/xman/01.JPG
  • ...
  • ..
  • .
  • /Media/image/hot/youknowwhatitis/hot01.JPG

context.getContentResolver().queryのカーソルから常に最初のレコードを読み取ります。

通常、最初に DCIM 内の写真を返し、次に他の写真/画像/写真を返します。

ある日の朝、ファイルを DCIM から別のフォルダーに移動しました (Android のギャラリー アプリ経由)。

context.getContentResolver().queryの最初のレコードが他の非 DCIM コンテンツに変更され、

この問題を私に持ってきてください...orz


これは完全な解決策ではありません。ユーザーが DCIM に写真を撮っていない場合、この解決策は役に立たなくなります。

私はマルチメディア APP を開発しているので、ユーザーは写真愛好家である必要があると思います... これが今まで私ができる最善の方法です。

于 2013-02-06T07:19:01.043 に答える