Java.lang.RuntimeException: Ошибка предоставления результата ResultInfo {who = null, request = 1888, result = 0, data = null} для активности
Мое приложение позволяет пользователю нажимать кнопку, она открывает камеру, они могут делать снимок, и он будет отображаться в изображении. Если пользователь отжимает или отменяет пока камера открыта, я заставляю эту силу закрываться - Ошибка выдачи результата ResultInfo {who = null, request = 1888, result = 0, data = null} для активности... поэтому я угадываю результат = 0 - вопрос, что мне нужно вставить, чтобы закрыть эту остановку?
Ниже мой код. Я знаю, что забываю что-то, но просто не могу понять это! (По общему признанию, я занимаюсь разработкой Android в течение 2 недель). Спасибо за любую помощь!
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
Ответы
Ответ 1
Добавление этого первого условия должно работать:
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);
}
}
}
Ответ 2
Если пользователь отменит запрос, данные будут возвращены как NULL
. При вызове data.getExtras().get("data");
поток будет вызывать nullPointerException
. Я думаю, вам просто нужно добавить условие, чтобы проверить, не вернулись ли данные.
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);
}
}
Ответ 3
Я рекомендую использовать это:
-
Извлеките отца Intent
.
Intent intentParent = getIntent();
-
Передайте сообщение напрямую.
setResult(RESULT_OK, intentParent);
Это предотвращает потерю активности, которая приведет к ошибке нулевой информации.
Ответ 4
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, это будет только в том случае, если снимок сделан и выбран, и все сработало. Это условие if должно проверять каждое условие.
Ответ 5
У меня появилось это сообщение об ошибке, потому что я использовал сеть в основном потоке, а новые версии 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);
Ответ 6
Я также столкнулся с этим вопросом, я решил его, добавив два условия:
resultCode != null
другой:
resultCode != RESULT_CANCELED
Ответ 7
это мой случай
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;
это также может вызвать проблему
Ответ 8
Моя проблема была в вызываемой активности, когда она пытается вернуться к предыдущей деятельности, "заканчивая". Я неправильно установил намерение. Следующий код - Kotlin.
Я делал это:
intent.putExtra("foo", "bar")
finish()
Когда я должен был это сделать:
val result = Intent()
result.putExtra("foo", "bar")
setResult(Activity.RESULT_OK, result)
finish()