2016-09-17 5 views
0

Я нашел учебник онлайн here как для захвата изображений, они очень похожи, и я использовал друг друга, чтобы выяснить, почему мой код камеры не работает.Предварительный просмотр камеры Android не отображается

Я не получаю никаких синтаксических ошибок в Android, но когда я иду на нужный фрагмент, это просто белый экран, нет дисплея камеры, и я понятия не имею, почему я рассмотрел как примеры кода в глубину, так и googled моя проблема, но не могу найти ничего. Единственное отличие моего кода заключается в том, что его фрагмент вместо активности. Может кто-нибудь, пожалуйста, помогите мне?

Вот мой код:

public class Image extends Fragment implements SurfaceHolder.Callback { 

private ImageView imageView; 
private SurfaceView mSurfaceView; 
private Bitmap capturedImage; 


//Camera 

private SurfaceHolder sHolder; 
private Camera mCamera; 
private Parameters parameters; 

/**********************************************/ 

public Image() { 
    // Required empty public constructor 
} 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.image_activity, container, false); 

    imageView = (ImageView) view.findViewById(R.id.imageView); 
    mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceView); 

    //Get a surface 
    sHolder = mSurfaceView.getHolder(); 

    //add the callback interface methods defined below as the Surface View callbacks 
    sHolder.addCallback(this); 

    //tells Android that this surface will have its data constantly replaced 
    sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    return view; 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 

    // The Surface has been created, acquire the camera and tell it where 
    // to draw the preview. 

    mCamera = Camera.open(); 
    try { 
     mCamera.setPreviewDisplay(holder); 

    } catch (IOException exception) { 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 


    //get camera parameters 
    parameters = mCamera.getParameters(); 

    parameters.setPreviewSize(352, 288); 
    //set camera parameters 
    mCamera.setParameters(parameters); 
    mCamera.startPreview(); 

    //sets what code should be executed after the picture is taken 
    Camera.PictureCallback mCall = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      //decode the data obtained by the camera into a Bitmap 
      capturedImage = BitmapFactory.decodeByteArray(data, 0, data.length); 
      String filename= Environment.getExternalStorageDirectory() 
        + File.separator + "testimage.jpg"; 
      FileOutputStream out = null; 
      try { 
       out = new FileOutputStream(filename); 
       capturedImage.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance 
       // PNG is a lossless format, the compression factor (100) is ignored 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        if (out != null) { 
         out.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      //set the iv_image 
      imageView.setImageBitmap(capturedImage); 
     } 
    }; 

    mCamera.takePicture(null, null, mCall); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

    mCamera.stopPreview(); 
    mCamera.release(); 
    mCamera = null; 
    } 
} 

Вот мой XML-файл:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<SurfaceView 
    android:id="@+id/surfaceView" 
    android:layout_height="0dip" 
    android:layout_width="0dip"> 

</SurfaceView> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView"> 

</ImageView> 

</LinearLayout> 

Update 1:

Вот мой файл манифеста, я забыл включить это:

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

Я также включил разрешения в настройках зефира для приложения, но до сих пор ничего не показывает

Update 2: Просто попробовал с API 17 устройства и там до сих пор нет предварительного просмотра

+0

Может ли кто-нибудь помочь? Ive попробовал все, что я знаю – AndroidLearner

+0

i буквально копировал и вставлял этот код в новый класс, расширяя активность, просто для тестирования и все еще не работает. может кто-то проверить этот PLS? http://stackoverflow.com/documentation/android/4789/camera-and-gallery/12655/take-photo#t=201609161413543951207 – AndroidLearner

+0

Несколько основных советов по отладке: 1) Добавьте несколько отчетов о регистрации на каждый этап вашего запуска чтобы они все работали в ожидаемом порядке. Если нет, то есть ключ. 2) Включите вывод logcat с момента запуска приложения с вопросом –

ответ

1

Пожалуйста, убедитесь, что вы добавили необходимую камеру разрешите в файл AndroidManifest.xml &, если вы используете зефир, пожалуйста, проверьте еще один шаг, разрешающий разрешение, от установки => Приложения => Диспетчер приложений => Ваше приложение => Разрешения

+0

i обновил мой пост – AndroidLearner

1

Предполагая, что весь ваш код действительно запущен, поскольку вы предположим, одна возможность: setPreviewSize(352, 288) - этот размер не поддерживается.

Вам нужно будет проверить список поддерживаемых форматов предварительного просмотра и выбрать один или использовать 320,240 или 640,480, которые в основном всегда доступны.

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