2017-02-03 10 views
1

私のアプリからカメラを起動して写真を撮っています。ギャラリーでも利用可能になります。最新の写真を取得するには

よくある問題は、写真のパスを知ることです。提案された解決策は以下のとおりです。

  1. パスを自分で保存し、ギャラリーの最後の撮影した写真からパスを取るEXTRA_OUTPUT
  2. を使用しての上にそれを送信します。

解決策1 isn't reliable

私はこのコードで、溶液2作品を作るためにしようとしている:

public static String getTakenPhotoPath(Context context) { 
    try { 
     String[] projection = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = context.getContentResolver().query(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       projection, null, null, null); 

     int column_index_data = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToLast(); 

     return cursor.getString(column_index_data); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 

     return null; 
    } 
} 

これは、最新の写真のパスを返しません。それは前のものを返します。あなたがカメラを開いているとき、あなたはこのような将来の撮影した画像のためにあなた自身の好みの場所を渡すことができます:あなたはそれはこのように行うことができます

private void addToGallery(Uri urlType, String path) { 
    if (!Strings.isNullOrEmpty(path)) { 
     ContentValues values = new ContentValues(); 
     // Add the date meta data to ensure the image is added at the front of the gallery 
     values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); 
     values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); 
     values.put(MediaStore.MediaColumns.DATA, path); 

     getContentResolver().insert(urlType, values); 

     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     Uri contentUri = Uri.fromFile(new File(path)); 
     mediaScanIntent.setData(contentUri); 
     sendBroadcast(mediaScanIntent); 
    } 
} 
+0

解決策2は、解決策1よりも信頼性が低い。カメラアプリがイメージのMediaStoreインデックスを持っている必要はありません。タイムリーな方法でそれを行うだけです。推奨される 'ACTION_IMAGE_CAPTURE'トリアージについては、[この回答](https://stackoverflow.com/a/41945392/115145)を参照してください。 – CommonsWare

+0

解決策1は信頼できるものです。私はそれが失敗するのを見たことがない。 – greenapps

+0

@greenapps:Stack Overflowでは、さまざまなカメラアプリの問題を報告している皆さんがここにいませんでした。 'ACTION_IMAGE_CAPTURE'は単純にはあまりテストされておらず、' ACTION_IMAGE_CAPTURE'がどのように動作するかについてのドキュメントを読まない開発者もいます。詳細については、[2015年のこの噂](https://commonsware.com/blog/2015/06/08/action-image-capture-fallacy.html)を参照してください。 – CommonsWare

答えて

0

:最新の写真のパスを求めて前に、私はこれをやっています与えられたコードで。 onActivityResultでは、そのイメージパスを直接使用して使用することができます。

File image ; 
    Intent photoCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages"); 
      imagesFolder.mkdirs(); // <---- 
      image = new File(imagesFolder, getFileName()); 
      Uri uriSavedImage = Uri.fromFile(image); 
      photoCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
      startActivityForResult(photoCaptureIntent, PICK_FROM_CAMERA); 


    private String getFileName() { 
      SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
      Date now = new Date(); 
      String fileName = formatter.format(now) + ".jpg"; 
      return fileName; 
     } 


@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     try { 
      setResult(resultCode, data); 


      switch (requestCode) { 
       case PICK_FROM_CAMERA: 
        try { 
         if (resultCode != RESULT_CANCELED) { 
          Intent upload = new Intent(EditProfile.this, ImageCropingFucAtivity.class); 
          prefs.edit().putBoolean("FromCamera", true).commit(); 
          upload.putExtra(CropImage.IMAGE_PATH, image.toString()); 
          upload.putExtra(CropImage.SCALE, true); 
          upload.putExtra(CropImage.ASPECT_X, 2); 
          upload.putExtra(CropImage.ASPECT_Y, 2); 
          startActivity(upload); 
          imageSelected = true; 
          finish(); 
         } 

        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

        break; 

        } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
+0

正確に彼の "解決策1"ではないですか? – marienke

+0

しかし、それは彼のクエリのための解決策です、そして、私はそれがうまく動作している私のプロジェクトでこれを使用しています。 –

関連する問題