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.
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
Cách sử dụng-quyền thêm vào câu trả lời? –
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