2012-10-21 34 views
8

Tôi có một chương trình mở camera qua Intent để chụp ảnh. Phần lớn đó đã hoạt động tốt rồi. Tuy nhiên, tôi muốn nó để lưu vào một thư mục nhất định với một tên tập tin nhất định (tên tập tin là tùy chọn nhưng nó thực sự sẽ giúp đỡ).Android - Chụp ảnh và lưu chúng với tên tùy chỉnh đến đích tùy chỉnh qua Intent

Vì vậy, đây là những gì tôi có cho đến nay.

Đây là dòng mã mở camera:

//TODO camera stuff. 
Intent openCam = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

//The two lines of code below were commented out at first. 
//They were eventually added when I tried to save it with a custom name and destination 
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image 
openCam.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name 

startActivityForResult(openCam, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

handler quả goes here:

//TODO handle result 
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
    if (resultCode == RESULT_OK) { 
     // Image captured and saved to fileUri specified in the Intent 
     Toast.makeText(this, "Image saved to:\n" + 
        data.getData(), Toast.LENGTH_LONG).show(); 
      System.out.println("I am here"); 

    } 
    else if (resultCode == RESULT_CANCELED) { 
      // User cancelled the image capture 
    } 
    else { 
      // Image capture failed, advise user 
    } 
} 

Trước khi tôi thực hiện hai phương thức dưới đây, các mã được làm việc tốt. Tuy nhiên nó đã được lưu vào thư mục mặc định với tên tập tin mặc định (phiên bản tem thời gian). Bánh mì nướng hiển thị "Imaged saved to: null" vì tôi chưa đặt phần đó.

Vì vậy, đây là những phương pháp được cho là để xử lý tên tập tin tùy chỉnh và đích

/** Create a file Uri for saving an image or video */ 
private static Uri getOutputMediaFileUri(int type){ 
     return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** Create a File for saving an image or video */ 
private static File getOutputMediaFile(int type){ 
    // To be safe, you should check that the SDCard is mounted 
    // using Environment.getExternalStorageState() before doing this. 

    Environment.getExternalStorageState(); 

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
    // This location works best if you want the created images to be shared 
    // between applications and persist after your app has been uninstalled. 

    // Create the storage directory if it does not exist 
    if (! mediaStorageDir.exists()){ 
     if (! mediaStorageDir.mkdirs()){ 
      Log.d("MyCameraApp", "failed to create directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
     "IMG_"+ timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

* Những mã đã được nâng lên từ Guide Máy ảnh từ developer.android.com.

Đoạn mã trên quản lý để mở Máy ảnh và chụp ảnh và lưu chúng. Tuy nhiên, vấn đề xảy ra khi người dùng quyết định ngừng chụp ảnh và bấm phím quay lại. Điều gì xảy ra lực lượng ứng dụng đóng vai trò quant đưa ra lỗi này:

10-21 12:44:33.699: E/AndroidRuntime(13016): FATAL EXCEPTION: main 
10-21 12:44:33.699: E/AndroidRuntime(13016): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.AIC.QRCodeScanner/com.AIC.QRCodeScanner.QRCodeScanner}: java.lang.NullPointerException 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.os.Looper.loop(Looper.java:123) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread.main(ActivityThread.java:3691) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at java.lang.reflect.Method.invokeNative(Native Method) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at java.lang.reflect.Method.invoke(Method.java:507) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at dalvik.system.NativeStart.main(Native Method) 
10-21 12:44:33.699: E/AndroidRuntime(13016): Caused by: java.lang.NullPointerException 
10-21 12:44:33.699: E/AndroidRuntime(13016): at com.AIC.QRCodeScanner.QRCodeScanner.onActivityResult(QRCodeScanner.java:379) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.Activity.dispatchActivityResult(Activity.java:3934) 
10-21 12:44:33.699: E/AndroidRuntime(13016): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
10-21 12:44:33.699: E/AndroidRuntime(13016):  
... 11 more 

Dòng nó trỏ tới sẽ là dòng này (dòng 379): data.getData(), Toast.LENGTH_LONG

Tuy nhiên, các tập tin được lưu ở thư mục /Pictures/MyCameraApp cùng với các bức ảnh Instagram đã được chụp.

Vì vậy, các câu hỏi là: 1. Có cách nào để thực hiện onActivityResult hoạt động đúng không? Tôi biết tôi chỉ có thể sử dụng startActivity để không giết ứng dụng. 2. Có cách nào chỉ chụp một tấm với máy ảnh không? Vì vậy, sau khi người dùng lưu ảnh, ứng dụng sẽ quay trở lại hoạt động chính. 3. Ngoài ra, tôi có thể lưu nó vào một thư mục của riêng mình không? Tôi không chắc chắn lý do tại sao nó lưu các bức ảnh trong /Pictures/MyCameraApp, tôi muốn nó chỉ tiết kiệm để /MyCameraApp.

Tôi nghĩ rằng tôi đang bỏ lỡ một điều đơn giản ở đây.

Trả lời

19

Dưới đây là đoạn code mà làm cho nó hoạt động:.

//camera stuff 
Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 

//folder stuff 
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages"); 
imagesFolder.mkdirs(); 

File image = new File(imagesFolder, "QR_" + timeStamp + ".png"); 
Uri uriSavedImage = Uri.fromFile(image); 

imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 
startActivityForResult(imageIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

Nó mở camera và mất đúng một shot (nó đi lại cho các hoạt động chính sau khi người dùng lưu các hình ảnh đó đã được chụp Nó tiết kiệm hình ảnh vào thư mục quy định.

+1

dòng filepath không phục vụ bất kỳ mục đích nào? Tốt nhất loại bỏ nó. – Laurent

+0

Cách sử dụng-quyền thêm vào câu trả lời? –

+0

Nó sẽ tạo một tệp tương tự trong thư mục được chỉ định. Làm thế nào để tạo một Hình ảnh mới có cùng tên. – taranjeetsapra

7

Bạn có thể lấy ảnh của bạn trong thư mục của bạn, nhưng cho rằng bạn sẽ phải vượt qua các tên tập tin với mục đích sử dụng mã dưới đây

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
File out = Environment.getExternalStorageDirectory(); 
out = new File(out, imagename); 
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out)); 
startActivityForResult(i, CAMERA_RESULT); 

Các tập tin ra chứa đường dẫn đầy đủ và tên tập tin.

Bây giờ, hãy xử lý phương thức onActivityResult() và kiểm tra trạng thái của kết quả nếu kết quả là RESULT_OK sau đó sử dụng tên tệp mà bạn đã cung cấp với ý định truy cập ảnh.

Bạn có thể tham khảo How to get camera result as a uri in data folder? để có thêm tùy chọn.

Sửa

Bạn đang nhận được data.getData() để null bởi vì nó sẽ được null nếu bạn vượt qua url tập tin với mục đích. Thật vậy, bạn đã có đường dẫn tập tin mà bạn đang đi với ý định như vậy tại sao bạn đang cố gắng lấy nó từ bó trong onActivityResult()?

+0

Xin lỗi, tôi cập nhật câu hỏi của tôi. :) – Razgriz

+0

@Razgriz Kiểm tra câu trả lời của tôi được cập nhật. – Dharmendra

+0

Oh hmm. Tôi đã bình luận nó ra và nó hoạt động tốt nhưng có một số kết quả không mong muốn. Tôi đã làm theo các liên kết bạn đã gửi và tôi tinh chỉnh nó một chút và câu trả lời tôi muốn. Đăng câu trả lời sau giây lát. – Razgriz

0

này có thể giúp u

File file=new File(Environment.getExternalStorageDirectory(),"file name"); 

button.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     opencam(); 
    } 
}); 

protected void opencam() { 
    Intent in = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
    in.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file)); 
    startActivityForResult(in,1); 
} 
Các vấn đề liên quan