2010-07-18 26 views
5

Tôi có một ứng dụng khá đơn giản để khởi chạy camera từ menu. Chiếc máy ảnh này ra mắt tốt, nhưng khi tôi nhấn ok sau khi chụp ảnh tôi nhận được một NPE về mối quan hệ của tôi một:Tôi nhận được một NullPointerException khi tôi sử dụng ACTION_IMAGE_CAPTURE để chụp ảnh

E/AndroidRuntime(3891): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {net.asplode.tr/net.asplode.tr.PostImage}: java.lang.NullPointerException 
E/AndroidRuntime(3891): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) 
E/AndroidRuntime(3891): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) 
E/AndroidRuntime(3891): at android.app.ActivityThread.access$2800(ActivityThread.java:125) 
E/AndroidRuntime(3891): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) 
E/AndroidRuntime(3891): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(3891): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(3891): at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime(3891): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(3891): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(3891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime(3891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime(3891): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(3891): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(3891): at net.asplode.tr.PostImage.onActivityResult(PostImage.java:92) 
E/AndroidRuntime(3891): at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
E/AndroidRuntime(3891): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 
E/AndroidRuntime(3891): ... 11 more 
W/ActivityManager( 85): Force finishing activity net.asplode.tr/.PostImage 

Code:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.mnuCamera) { 
     Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     ContentValues values = new ContentValues(); 
     values.put(Media.TITLE, "image"); 
     Uri tempPhotoUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempPhotoUri); 
     startActivityForResult(cameraIntent, FROM_CAMERA); 
     return true; 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != RESULT_OK) { 
     return; 
    } 
    Uri imageUri = data.getData(); 
    Log.i("imageUri: ", imageUri.toString()); 
} 

Trả lời

6

Hóa ra các ứng dụng máy ảnh cổ không gửi EXTRA_OUTPUT, đó là lý do tại sao nó là null. Tuy nhiên, một số ứng dụng máy ảnh (như người anh hùng) làm. Tuyệt vời. Vì vậy, câu trả lời là chỉ định EXTRA_OUTPUT. Ứng dụng máy ảnh một Nexus sẽ lưu hình ảnh vào vị trí đó. Sau đó, trong onActivityResult() kiểm tra xem mục đích là null. Nếu không, sử dụng data.getData(), và nếu nó sau đó sử dụng vị trí cụ thể trong EXTRA_OUTPUT thông qua một hằng số và chèn nó vào Mediastore. Urgh.

+0

Trong onActivityResult() nếu mục đích là null, thì cách lấy đường dẫn hình ảnh @nsheridan – Abhi

+3

@nsheridan - Xin lỗi vì bận tâm một câu hỏi cũ, tôi có cùng một vấn đề nhưng thực sự phát điên vì tôi không thể làm cho nó hoạt động được. Bạn có thể vui lòng đăng một số mã để hiển thị giải pháp của bạn? THks trước ... – Matteo

3

này không thực sự có vẻ như một câu hỏi, nhiều như một tuyên bố thực tế. Nếu bạn đang yêu cầu những gì là null, có hai điều mà có thể được null:

-Các Ý định 'dữ liệu'
-Các Uri 'imageUri'

Bạn có thêm the Extra, 'EXTRA_OUTPUT', để ý định? Nếu không, bạn sẽ chỉ có thể truy xuất một hình ảnh có kích thước nhỏ trong trường Thêm. Và điều này dường như có thể là NPE của bạn, xảy ra trên 'imageUri'.

+0

Bạn nói đúng, đó không thực sự là một câu hỏi. Đây là câu hỏi của tôi: bất cứ ai có thể giúp tôi xác định lý do tại sao tôi nhận được một npe với dữ liệu = null? Tôi biết ý định là null, stacktrace cho tôi biết: ResultInfo {who = null, request = 0, result = -1, data = null} Tôi có cameraIntent.putExtra (MediaStore.EXTRA_OUTPUT, tempPhotoUri); trong mã trên cũng vậy. Tôi tin rằng điều này là chính xác. – nsheridan

+0

Bạn có thấy câu hỏi khác này trên StackOverflow không? http://stackoverflow.com/questions/1910608/android-action-image-capture-intent –

0

onActivityResult được gọi khi bất kỳ hoạt động nào bạn đã bắt đầu kết thúc, vì vậy nếu bạn bắt đầu một hoạt động không gửi dữ liệu thì sẽ có sự cố.

1

Dựa trên giải pháp của nsheridan, tôi vừa tạo fileUri mà tôi đã thêm vào trong intent (intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri);) được biết đến trong suốt lớp. Trong ActivityResult(), tôi đã kiểm tra xem intent == null, nếu có, biến fileUri được sử dụng thay vì cố gắng lấy nó ra khỏi intent.getData().

Làm việc tốt cho tôi ngay bây giờ.

Các vấn đề liên quan