2016-02-03 3 views
0

Я изучаю Android-камеру Api, и я тестирую ее на устройстве Nexus 6. Я загрузил учебник Camera Api, который отлично работает на устройстве. Затем я создал свой собственный проект и, по сути, скопировал код, но тот всегда возвращает null всякий раз, когда вызываю Camera.open(). Код практически идентичен.Android: Camera.Open() возвращает null с одним проектом, но не с другим. Такое же устройство

Манифесты также идентичны, а также мои файлы градиента.

Но учебник, загруженный с веб-сайта, работает, пока тот, который я создал из Android Studio, не работает.

Я не могу понять, что я делаю неправильно. Я проверил предыдущие вопросы относительно этой проблемы, и я не делаю ту же ошибку. Разрешения Manifest находятся в правильном месте (над тегом приложения), Nexus 6 имеет заднюю камеру, поэтому никакая камера не является проблемой.

Non Рабочая Manifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.gr3ymatter.cameraapidemo"> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Non Рабочая MainActivity:

import android.content.pm.ActivityInfo; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends ActionBarActivity { 

    private ImageSurfaceView mImageSurfaceView; 
    private Camera camera; 

    private FrameLayout cameraPreviewLayout; 
    private ImageView capturedImageHolder; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     cameraPreviewLayout = (FrameLayout)findViewById(R.id.camera_preview); 
     capturedImageHolder = (ImageView)findViewById(R.id.captured_image); 

     camera = checkDeviceCamera(); 
     mImageSurfaceView = new ImageSurfaceView(MainActivity.this, camera); 
     cameraPreviewLayout.addView(mImageSurfaceView); 

     Button captureButton = (Button)findViewById(R.id.button); 
     captureButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       camera.takePicture(null, null, pictureCallback); 
      } 
     }); 
    } 
    private Camera checkDeviceCamera(){ 
     Camera mCamera = null; 
     try { 
      mCamera = Camera.open(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return mCamera; 
    } 

    Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
      if(bitmap==null){ 
       Toast.makeText(MainActivity.this, "Captured image is empty", Toast.LENGTH_LONG).show(); 
       return; 
      } 
      capturedImageHolder.setImageBitmap(scaleDownBitmapImage(bitmap, 300, 200)); 
     } 
    }; 

    private Bitmap scaleDownBitmapImage(Bitmap bitmap, int newWidth, int newHeight){ 
     Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 
     return resizedBitmap; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

неработающих SurfaceView Класс

import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

import java.io.IOException; 

/** 
* Created by Afzal on 2/2/16. 
*/ 

public class ImageSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

    private Camera camera; 
    private SurfaceHolder surfaceHolder; 

    public ImageSurfaceView(Context context, Camera camera) { 
     super(context); 
     this.camera = camera; 
     this.surfaceHolder = getHolder(); 
     this.surfaceHolder.addCallback(this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      this.camera.setPreviewDisplay(holder); 
      this.camera.startPreview(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

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

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     this.camera.stopPreview(); 
     this.camera.release(); 
    } 
} 

Файлы рабочих проектов такие же, как я буквально скопировал их, когда я следил за примером. Я могу вставить ссылку github как для рабочих, так и для нерабочих проектов, если это поможет?

EDIT: Вот репо для двух проектов https://github.com/Gr3ymatter/CameraApiDemo_Working https://github.com/Gr3ymatter/CameraApiDemo_NotWorking

EDIT: выход LogCat. Также, основываясь на полезных отзывах Madhurs, я подумал, что это проблема с устройством, поэтому я запустил это на Nexus 7, но у меня все еще была та же проблема.

enter image description here

Заранее спасибо за помощь!

ответ

2

Вы должны спросить разрешения в связующем 6 из Android 6,0 ​​ проверки для получения дополнительной информации о permissions

ИЛИ вы можете изменить в манифесте,

//make target lower then 23 then it will run properly in android M 
    <uses-sdk 
      android:minSdkVersion="15" 
      android:targetSdkVersion="22" /> 

Примера без разрешений

Проверить этот пример надеюсь, что это поможет,

https://github.com/pikanji/CameraPreviewSample

ВАШ КОД РАБОЧИЕ ДЛЯ МЕНЯ

image

+0

Спасибо за Ваш комментарий, к сожалению делать что-либо менять вратаря. Смущает то, что рабочий проект имеет те же права, что и мой. – user1953478

+0

чувак увидеть целиdk в манифесте и выполнил sdk в граде, он должен быть ниже 22, а также проверить проект, который работал – Madhur

+0

Я проверил. Я также разместил здесь оба проекта, чтобы вы могли сами убедиться. Файлы манифеста и градиента идентичны и выше 22. Оба имеют значение 23. https://github.com/Gr3ymatter/CameraApiDemo_NotWorking https://github.com/Gr3ymatter/CameraApiDemo_Working – user1953478

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