0

我想拍照並將其存儲在名爲Medit的文件夾中,通過我的應用程序。當我的應用程序啓動時,它應該能夠從該文件夾中提取所有圖片並直接顯示它。所以數據存儲路徑必須設置並存儲爲應用程序的一部分。以下是我迄今面對在Android中使用相機的問題

public void CaptureImage(){ 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName"); 
     mUri =Uri.fromFile(mediaStorageDir+"IMG"+System.currentTimeMillis() + ".jpg"); 

     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri); 
     startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 

    } 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
      super.onActivityResult(requestCode, resultCode, data); 
      Bitmap bm = BitmapFactory.decodeFile(mUri.getPath()); 
      imgVIew.setImageBitmap(bm); 
      }else Log.d("capture", "FAILED");} 

發行完成後,不管什麼我改變穆裏到被存儲在DCIM /攝像機圖像與默認的命名約定的圖片。在onActivityResult中,我捕捉圖像。問題是我無法控制它的存儲位置和名稱。我需要

1)通過意圖捕獲圖像,將其存儲在具有自定義名稱的位置。

2)每次應用程序打開時,它應該到同一個存儲位置,並將圖片一張接一張地顯示出來。

+0

請粘貼您的onActivityResult – HoseinIT

+0

只是做了。我需要一個訪問路徑。我使用http://voidcanvas.com/whatsapp-like-image-compression-in-android/作爲參考,但這個應用程序出於某種原因在我的朋友的手機上不停地崩潰。所有手機可能沒有外部SD卡,所以我需要檢查一下嗎? –

+0

沒有安全路徑,因爲用戶可以看到對SD卡或內部存儲的最新更改。所以你必須加密你的數據,如果他們是敏感的 – HoseinIT

回答

0

不管我改變穆裏的畫面是什麼被存儲在DCIM /攝像機圖像與默認最有可能的命名約定

,那就是在相機應用程序中的錯誤。大多數相機應用程序將正確地兌現EXTRA_OUTPUT。但是,沒有執行機制來確保相機應用會遵守EXTRA_OUTPUT

但是,請不要使用字符串連接來創建文件路徑,並確保您創建您的目錄。 IOW,替換:

mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName"); 
mUri =Uri.fromFile(mediaStorageDir+"IMG"+System.currentTimeMillis() + ".jpg"); 

有:

mediaStorageDir=new File(Environment.getExternalStorageDirectory(),"MyAppName"); 
mediaStorageDir.mkdirs(); 
mUri=Uri.fromFile(new File(mediaStorageDir, "IMG"+System.currentTimeMillis() + ".jpg")); 

有可能改變這個代碼將會使您的應用程序與此特定的相機應用程序更兼容,但沒有保證所有相機應用將按照您的意願行事。

我需要......

你的代碼寫給你想要的東西。但是,您正在調用第三方應用程序ACTION_IMAGE_CAPTUREIntent。有成千上萬的相機應用程序,既可以預先安裝,也可以從Play商店和其他地方下載。許多人將會正常工作ACTION_IMAGE_CAPTURE的實現。有些人不會。

或者:

  • 檢測圖像是不是在你希望的路徑,讓用戶知道他們的相機應用被打破。然後,建議他們安裝一些您測試過的第三方相機應用程序。或者,

  • 使用ACTION_IMAGE_CAPTURE,並用相機的API直接工作,雖然這是相當困難的停止。

+0

我像你所說的那樣替換了所需的行,但它不會改變圖像的存儲位置。它仍然會去DCIM /相機。我會得到我朋友的電話,並嘗試在他的。 –

0

由於您提供的路徑錯誤,您的照片正在保存在默認路徑中。使用下面的代碼。

File mediaStorageDir =new File(Environment.getExternalStorageDirectory(),"MyAppName"); 

    if(!mediaStorageDir.exists()) 
     mediaStorageDir.mkdir(); 

    Uri mUri = Uri.fromFile(new File(mediaStorageDir.getAbsolutePath() + "/IMG" + System.currentTimeMillis() + ".jpg")); 
    LogHelper.LogI("path", mUri.getPath()); 
0

請嘗試下面的代碼它爲我工作。

public class CaptureImage extends Activity { 

private static final int PICK_CAMERA_IMAGE = 2; 

ImageView img; 
Button btn; 

private Uri mImageCaptureUri; 

public static String userPicPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_capture_image); 

    img = (ImageView) findViewById(R.id.activity_capture_image_img); 
    btn = (Button) findViewById(R.id.button1); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      SimpleDateFormat dateFormatter = new SimpleDateFormat(
        "yyyyMMdd_HHmmss", Locale.US); 

      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      File file = new File(Environment.getExternalStorageDirectory() 
        + "/" + Constants.IMAGE_DIRECTORY_NAME, "img_" 
        + dateFormatter.format(new Date()).toString() + ".png"); 
      userPicPath = file.getPath(); 
      mImageCaptureUri = Uri.fromFile(file); 

      intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
      startActivityForResult(intent, PICK_CAMERA_IMAGE); 
     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_CAMERA_IMAGE && resultCode == RESULT_OK) { 

     Log.d("CaptureImage", mImageCaptureUri.toString()); 

     Bitmap bitmapProfile = getBitmap(userPicPath, this); 
     img.setImageBitmap(bitmapProfile); 

    } 
} 

public static Bitmap getBitmap(String path, Context context) { 
    Uri uri = Uri.fromFile(new File(path)); 
    InputStream in = null; 
    ContentResolver mContentResolver = context.getContentResolver(); 
    try { 
     // final int IMAGE_MAX_SIZE = 2048; 
     final int IMAGE_MAX_SIZE = 1024; 
     in = mContentResolver.openInputStream(uri); 

     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 

     BitmapFactory.decodeStream(in, null, o); 
     in.close(); 

     int scale = 1; 
     if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { 
      scale = (int) Math.pow(
        2, 
        (int) Math.round(Math.log(IMAGE_MAX_SIZE 
          /(double) Math.max(o.outHeight, o.outWidth)) 
          /Math.log(0.5))); 
     } 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     in = mContentResolver.openInputStream(uri); 
     Bitmap b = BitmapFactory.decodeStream(in, null, o2); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     b.compress(Bitmap.CompressFormat.JPEG, 25, stream); 
     in.close(); 

     return b; 
    } catch (FileNotFoundException e) { 
     Log.e("CaptureImage", "file " + path + " not found"); 
    } catch (IOException e) { 
     Log.e("CaptureImage", "file " + path + " not found"); 
    } 
    return null; 
} 

}