2016-12-29 6 views
-2

Я переписываю приложение для большинства версий Android. Приложение настроено на вызов android.hardware.Camera.Open() при запуске. Когда приложение запускается он дает ошибку Camera Error: Could not connect to cameraПочему приложение сбой при использовании android.hardware.Camera.Open()?

Права доступа в AndroidManifest.xml являются

<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-permission android:name="android.permission.camera"/> 
<uses-feature android:name="android.hardware.camera" android:required="false"/>`. 

Почему не может его подключить к камере?

+0

Вы добавили разрешение камеры ?? –

+0

@pankajkhedekar У меня есть рабочая версия этого приложения в магазине приложений Amazon, поэтому да – Raid

+0

какая ошибка вы получаете? –

ответ

1

проблема решена!

Вопрос был просто вопросом капитализации. Линия <uses-permission android:name="android.permission.camera"/> должна действительно читать <uses-permission android:name="android.permission.CAMERA"/>. Это произошло потому, что camera является аппаратной функцией, а CAMERA - это разрешение.

+0

Это самые неприятные проблемы. Хороший глаз. – JoxTraex

1

не только декларирование в manifest, но Вы должны предоставить permission от пользователя во время выполнения для Android 6.+ Используйте ниже сниппета для предоставления camera permission

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
          if (ContextCompat.checkSelfPermission(SplashScreenActivty.this, Manifest.permission.CAMERA) 
            != PackageManager.PERMISSION_GRANTED) { 
           ActivityCompat.requestPermissions(this, 
             new String[]{Manifest.permission.CAMERA}, 
             1); 
          } 

         } 


@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     switch (requestCode) { 
      case 1: { 

       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 


        // permission was granted, yay! Do the 
        // camera-related task you need to do. 
       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 

        Toast.makeText(this, "Permission denied to read SMS", Toast.LENGTH_SHORT).show(); 
        finish(); 
       } 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
0

В предыдущих версиях Android, чтобы использовать аппаратные камеры достаточно было указать правильные разрешения и использовать в манифесте android, но, поскольку появилась версия Marshmallow, недостаточно запустить приложение. Поскольку также необходимо включить разрешения во время выполнения. Подумайте о том, как использовать аналогичный код и соответствовать его вашему проекту, поскольку он дает вам возможность проверить и разрешить разрешение.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == PERMISSION_REQUEST_CODE) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      cameraPreview.initializeCamera(); 
     } else { 

     } 
     return; 
    } 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == PERMISSION_REQUEST_CODE) { 
     cameraPreview.initializeCamera(); 
     return; 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 


    public void requestCameraPermission() { 
    ActivityCompat.requestPermissions(this, 
      new String[]{ 
        Manifest.permission.CAMERA 
      }, 
      PERMISSION_REQUEST_CODE); 
} 

public void requestPermissionWithRationale() { 
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { 
     Snackbar.make(findViewById(android.R.id.content), R.string.no_cam_permission, Snackbar.LENGTH_INDEFINITE) 
       .setAction(R.string.snackbar_action_grant, new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         requestCameraPermission(); 
        } 
       }) 
       .show(); 
    } else { 
     requestCameraPermission(); 
    } 
} 
+0

Почему временные разрешения настолько сложны? – Raid

+0

Некоторые из приложений в прошлом работали с камерой и другим оборудованием, например, с записью голоса без какого-либо уведомления пользователя, поэтому разработчики решили просто спросить пользователя каждый раз, если он хочет, чтобы приложение сначала использовало такое оборудование. – ArturS

+0

Может быть полезно для вас https://developer.android.com/training/permissions/index.html – ArturS

0

Использование камеры для Устаревшие

Ниже приведен код

UPDATE --->

@Module 
public class CameraModule { 

    @Provides 
    CameraSupport provideCameraSupport() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      return new CameraNew(context); 
     } else { 
      return new CameraOld(); 
     } 
    } 
} 

, а затем для старой цели:

@SuppressWarnings("deprecation") 
public class CameraOld implements CameraSupport { 

    private Camera camera; 

    @Override 
    public CameraSupport open(final int cameraId) { 
     this.camera = Camera.open(cameraId); 
     return this; 
    } 

    @Override 
    public int getOrientation(final int cameraId) { 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(cameraId, info); 
     return info.orientation; 
    } 
} 

для нового Цель:

public class CameraNew implements CameraSupport { 

    private CameraDevice camera; 
    private CameraManager manager; 

    public CameraNew(final Context context) { 
     this.manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public CameraSupport open(final int cameraId) { 
     try { 
      String[] cameraIds = manager.getCameraIdList(); 
      if (ActivityCompat.checkSelfPermission(CameraPreview.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
       // TODO: Consider calling 
       // ActivityCompat#requestPermissions 
       // here to request the missing permissions, and then overriding 
       // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
       //           int[] grantResults) 
       // to handle the case where the user grants the permission. See the documentation 
       // for ActivityCompat#requestPermissions for more details. 

       return null; 
      } 
      manager.openCamera(cameraIds[cameraId], new CameraDevice.StateCallback() { 
       @Override 
       public void onOpened(CameraDevice camera) { 
        CameraNew.this.camera = camera; 
       } 

       @Override 
       public void onDisconnected(CameraDevice camera) { 
        CameraNew.this.camera = camera; 
        // TODO handle 
       } 

       @Override 
       public void onError(CameraDevice camera, int error) { 
        CameraNew.this.camera = camera; 
        // TODO handle 
       } 
      }, null); 
     } catch (Exception e) { 
      // TODO handle 
     } 
     return this; 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public int getOrientation(final int cameraId) { 
     try { 
      String[] cameraIds = manager.getCameraIdList(); 
      CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]); 
      return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
     } catch (CameraAccessException e) { 
      // TODO handle 
      return 0; 
     } 
    } 
} 
+0

Я не могу этого сделать, потому что мне нужно приложение для работы на старых устройствах (pre-api21) – Raid

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