java.lang.runtimeexception: результат сбоя результата
-
27-10-2019 - |
Вопрос
Мое приложение позволяет пользователю нажимать кнопку, оно открывает камеру, он может сфотографироваться, и она будет отображаться в изображении. Если пользователь нажимает обратно или отмену, пока камера открыта, я закрываю эту силу - сбой донесения результата результата = 0 - это проблема, что мне нужно, чтобы вставить, чтобы эта остановка закрывалась?
Ниже мой код. Я знаю, что что -то забываю, но просто не могу понять! (По общему признанию, у меня около 2 недель в изучении развития Android). Спасибо за помощь!
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.imageView = (ImageView)this.findViewById(R.id.photostrippic1);
ImageView photoButton = (ImageView) this.findViewById(R.id.photostrippic1);
photoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
});
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
Я думаю, что мне нужно где -то там "еще", но я не знаю, чтобы сделать это.
Ниже приведен logcat
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=0, data=null} to activity {photo.booth.app/photo.booth.app.PhotoboothActivity}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:2934)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2986)
at android.app.ActivityThread.access$2000(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1068)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at photo.booth.app.PhotoboothActivity.onActivityResult(PhotoboothActivity.java:76)
at android.app.Activity.dispatchActivityResult(Activity.java:4108)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2930)
... 11 more
Решение
Добавление этого первого условного должно работать:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode != RESULT_CANCELED){
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
}
Другие советы
Для пользователей Kotlin не забудьте добавить? в data: Intent?
как
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {}
Если пользователь отменит запрос, данные будут возвращены как NULL
. Анкет Нить бросит nullPointerException
Когда вы звоните data.getExtras().get("data");
. Анкет Я думаю, что вам просто нужно добавить условное, чтобы проверить, являются ли возвращенные данные нуль.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST) {
if (data != null)
{
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
Я рекомендую использовать это:
Забрать отца
Intent
.Intent intentParent = getIntent();
Передать сообщение напрямую.
setResult(RESULT_OK, intentParent);
Это предотвращает потерю своей деятельности, которая генерирует нулевую ошибку данных.
Для пользователей Kotlin
Вам просто нужно добавить ? с намерением в onActivityResult
как данные могут быть null
Если пользователь отменяет транзакцию или что -то идет не так. Поэтому нам нужно определить данные как nullable
в onActivityResult
Просто заменить onActivityResult
Подпись пробелкости с ниже:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == CAMERE_REQUEST && resultCode == RESULT_OK && data != null)
{
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
Вы можете проверить, будет ли ResultCode равен result_ok, это будет только в случае сделана и выбранная картина и все сработало. Это, если пункт здесь должен проверить каждое условие.
это мой случай
startActivityForResult(intent, PICK_IMAGE_REQUEST);
Я определил два кода запроса PICK_IMAGE_REQUEST
а также SCAN_BARCODE_REQUEST
с тем же значением, например.
static final int BARCODE_SCAN_REQUEST = 1;
static final int PICK_IMAGE_REQUEST = 1;
Это также может вызвать проблему
У меня появилось это сообщение об ошибке, потому что я использовал сеть в основной ветке, а новые версии Android имеют «строгую» политику, чтобы предотвратить это. Чтобы обойти это, просто бросьте любой сетевой подключение в Asynctask.
Пример:
AsyncTask<CognitoCachingCredentialsProvider, Integer, Void> task = new AsyncTask<CognitoCachingCredentialsProvider, Integer, Void>() {
@Override
protected Void doInBackground(CognitoCachingCredentialsProvider... params) {
AWSSessionCredentials creds = credentialsProvider.getCredentials();
String id = credentialsProvider.getCachedIdentityId();
credentialsProvider.refresh();
Log.d("wooohoo", String.format("id=%s, token=%s", id, creds.getSessionToken()));
return null;
}
};
task.execute(credentialsProvider);
Я также столкнулся с этим вопросом, я решил его, добавив два условия один:
resultCode != null
Другой:
resultCode != RESULT_CANCELED
Я делал это:
intent.putExtra("foo", "bar")
finish()
Когда я должен был сделать это:
val result = Intent()
result.putExtra("foo", "bar")
setResult(Activity.RESULT_OK, result)
finish()
AsyncTask<CognitoCachingCredentialsProvider, Integer, Void> task = new
AsyncTask<CognitoCachingCredentialsProvider, Integer, Void>() {
@Override
protected Void doInBackground(CognitoCachingCredentialsProvider... params) {
AWSSessionCredentials creds = credentialsProvider.getCredentials();
String id = credentialsProvider.getCachedIdentityId();
credentialsProvider.refresh();
Log.d("wooohoo", String.format("id=%s, token=%s", id, creds.getSessionToken()));
return null;
}
};
task.execute(credentialsProvider);
Проверять Ответ ключ 2018