0

Я использую камеру для захвата изображения и установки возвращенного растрового изображения в изображение, но он падает на устройства OnePlus. Я проверил несколько устройств htc, и он работает отлично. Я проверил решения, и они сказали проверить код запроса, но я уже это делаю. В чем проблема?Camera Intent возвращает null только на некоторых устройствах

Вот код

imageView.setOnClickListener(new View.OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

      startActivityForResult(cameraIntent, 1); 
     } 
    }); 

и onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1 && resultCode == -1) { 
     image = (Bitmap) data.getExtras().get("data"); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     // Must compress the Image to reduce image size to make upload easy 
     image.compress(Bitmap.CompressFormat.PNG, 50, stream); 
     byte[] byte_arr = stream.toByteArray(); 
     // Encode Image to String 
     encodedString = Base64.encodeToString(byte_arr, 0); 
     Uri selectedImageUri = data.getData(); 
     img_path = getRealPathFromURI(selectedImageUri); 
     // Uri tempUri = getImageUri(getApplicationContext(), image); 
     imageView.setImageBitmap(image); 
     imageView.setScaleType(ImageView.ScaleType.FIT_XY); 
    } 
} 

и трассировки стека ошибок

STACK_TRACE = java.lang.RuntimeException: Сбой доставки результата ResultInfo { who = null, request = 1, result = -1, data = Intent { act = inline-d ata (имеет дополнительные функции)}} для активности {com.madhours/com.madhours.activities.ActivitySignUp}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.net.Uri.getPath()»на нулевой объект ссылкой на android.app.ActivityThread.deliverResults (ActivityThread.java:3659) на android.app.ActivityThread.handleSendResult (ActivityThread.java:3702) в android.app.ActivityThread. доступ к $ 1300 (ActivityThread.java:155) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1366) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os. Looper.loop (Looper.java:135) в android.app.ActivityThread.main (ActivityThread.java:5343) в java.lang.reflect.Method.invoke (собственный метод) в java.lang.reflect.Method.invoke (Method.java:372) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:700) Вызвано: java.lang.NullPointerException: Попытка вызвать виртуальный метод «java.lang.String android.net.Uri.getPath()» на нулевой объект ссылкой на com.madhours.activities.ActivitySignUp.getRealPathFromURI (ActivitySignUp.java:134) в ком .madhours.activities.ActivitySignUp.onActivityResult (ActivitySignUp.java:116) в android.app.Activity.dispatchActivityResult (Activity.java:6218) на android.app.ActivityThread.deliverResults (ActivityThread.java:3655) ... подробнее 10 java.lang.NullPointerException: Попытка вызова виртуальной метод 'java.lang.String android.net.Uri.getPath()' на нулевой объект ссылкой на com.madhours.activities.ActivitySignUp.getRealPathFromURI (ActivitySignUp.java:134) на com.madhours.activities. ActivitySignUp.onActivityResult (ActivitySignUp.java:116) на android.app.Activity.dispatchActivityResult (Activity.java:6218) на android.app.ActivityThread.deliverResults (ActivityThread.java:3655) в т android.app.ActivityThread.handleSendResult (ActivityThread.java:3702) в android.app.ActivityThread.access $ 1300 (ActivityThread.java:155) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java: 1366) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5343) в java.lang.reflect.Method.invoke (собственный метод) в java.lang.reflect.Method.invoke (Method.java:372) в com.android.internal.os .ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:905) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:700)

ответ

0

Что может быть проблема?

Проблема в том, что вы вызываете getData() по возвращенному Intent. Возвращение Uri не является частью the ACTION_MEDIA_STORE contract:

Вызывающий может пройти дополнительный EXTRA_OUTPUT контролировать, где этот образ будет записан. Если EXTRA_OUTPUT не присутствует, изображение небольшого размера возвращается в качестве объекта Bitmap в дополнительное поле. Это полезно для приложений, которым требуется только небольшое изображение. Если EXTRA_OUTPUT присутствует, то полноразмерное изображение будет записано в значение Uri EXTRA_OUTPUT.

Учитывая, что вы не ставили EXTRA_OUTPUT на Intent вы использовали с startActivityForResult(), единственный результат, который вы получите это в data дополнительную плату: Bitmap.

Если вы хотите полноразмерное изображение написанную где, указать путь к этому расположению в EXTRA_OUTPUT, а затем, удерживая на этом пути и использовать его, когда onActivityResult() называется:

/*** 
Copyright (c) 2008-2016 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import java.io.File; 

public class CameraContentDemoActivity extends Activity { 
    private static final String EXTRA_FILENAME= 
    "com.commonsware.android.camcon.EXTRA_FILENAME"; 
    private static final String FILENAME="CameraContentDemo.jpeg"; 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (savedInstanceState==null) { 
     File dir= 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

     dir.mkdirs(); 
     output=new File(dir, FILENAME); 
    } 
    else { 
     output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); 
    } 

    if (output.exists()) { 
     output.delete(); 
    } 

    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putSerializable(EXTRA_FILENAME, output); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 
+0

Как установить изображение в ImageView в onActivityResult? –

+0

@VivekMishra: используйте свою любимую библиотеку для загрузки изображений (http://android-arsenal.com/tag/46), например [Picasso] (http://square.github.io/picasso/). – CommonsWare

+0

с использованием Uri.fromFile (output) ?? потому что, если я использую данные, он дает исключение нулевого указателя –

Смежные вопросы