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

}