Съемка с камеры, приводящая к сбою и выдаче результата ResultInfo
Я получаю следующую ошибку:
Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity
После того, как сделал снимок с моей камерой.
Это код для onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode == RESULT_OK)
{
if(requestCode == 1888)
{
final boolean isCamera;
if(data == null)
{
isCamera = true;
}
else
{
final String action = data.getAction();
if(action == null)
{
isCamera = false;
}
else
{
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}
Uri selectedImageUri;
if(isCamera)
{
selectedImageUri = outputFileUri;
}
else
{
selectedImageUri = data == null ? null : data.getData();
}
Log.i("DEBUG", "IMAGEURI: " + selectedImageUri);
coverPhoto.setImageURI(selectedImageUri);
setRealPath(selectedImageUri); <--- if i remove this it works.
}
}
}
Это код, который я использую, чтобы получить реальный путь.
public String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
// ERROR ORIGINATING THE LINE BELOW
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
Некоторые добытчики и сеттеры
public void setRealPath(Uri uri){
this.realPath = getRealPathFromURI(getApplicationContext(),uri);
}
public String getRealPath(){
return this.realPath;
}
Я проверяю это с помощью эмулятора genymotion. И я установил свою общую папку из VirtualBox.
Тем не менее, я не мог видеть изображение из My Picture (как установлено из VirtualBox).
Полный LogCat:
01-09 09:16:42.293: E/AndroidRuntime(1921): FATAL EXCEPTION: main
01-09 09:16:42.293: E/AndroidRuntime(1921): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {com.gelliesmedia.thumbqoo/com.gelliesmedia.thumbqoo.ProductPublishActivity}: java.lang.NullPointerException
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread.deliverResults(ActivityThread.java:3319)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread.access$1100(ActivityThread.java:141)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.os.Looper.loop(Looper.java:137)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread.main(ActivityThread.java:5041)
01-09 09:16:42.293: E/AndroidRuntime(1921): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 09:16:42.293: E/AndroidRuntime(1921): at java.lang.reflect.Method.invoke(Method.java:511)
01-09 09:16:42.293: E/AndroidRuntime(1921): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-09 09:16:42.293: E/AndroidRuntime(1921): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-09 09:16:42.293: E/AndroidRuntime(1921): at dalvik.system.NativeStart.main(Native Method)
01-09 09:16:42.293: E/AndroidRuntime(1921): Caused by: java.lang.NullPointerException
01-09 09:16:42.293: E/AndroidRuntime(1921): at com.gelliesmedia.thumbqoo.ProductPublishActivity.getRealPathFromURI(ProductPublishActivity.java:267)
01-09 09:16:42.293: E/AndroidRuntime(1921): at com.gelliesmedia.thumbqoo.ProductPublishActivity.setRealPath(ProductPublishActivity.java:357)
01-09 09:16:42.293: E/AndroidRuntime(1921): at com.gelliesmedia.thumbqoo.ProductPublishActivity.onActivityResult(ProductPublishActivity.java:351)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.Activity.dispatchActivityResult(Activity.java:5293)
01-09 09:16:42.293: E/AndroidRuntime(1921): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
01-09 09:16:42.293: E/AndroidRuntime(1921): ... 11 more
Может кто-нибудь сказать мне, как решить эту ошибку? Благодарю.
1 ответ
Я использую аналогичный код, чтобы определить, является ли полученное изображение с камеры или нет. Похоже, что на некоторых устройствах (в основном Motorola и HTC), data.getAction()
будет нулевым даже для результата Намерение, исходящее от камеры. Это означает, что selectedImageUri
становится нулевым Когда вы передаете это в запросе context.getContentResolver().query(contentUri, proj, null, null, null);
результирующий Курсор равен нулю, поэтому вы получаете NPE, когда пытаетесь с ним взаимодействовать.
Я работаю над другим способом, чтобы определить, если изображение с камеры и будет обновляться, когда я найду решение.
ОБНОВЛЕНИЕ 1/24: я не смог придумать лучший способ определить, является ли изображение с камеры. Похоже, что некоторые устройства просто сообщают об Uri по-другому, и нет хорошего способа проверить это. Тем не менее, кажется безопасным использовать необработанный Uri, если курсор нулевой:
/** snip **/
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
if (cursor == null) {
return contentUri;
}
/** carry on **/
Я проверил это на нескольких разных телефонах, и, похоже, он работает с изображениями с камер, изображениями галерей и изображениями из других источников, таких как Dropbox.