2016-12-29 13 views
-2

Androidのほとんどのバージョンでアプリを書き直しています。アプリは起動時にandroid.hardware.Camera.Open()に電話するように設定されています。アプリは、それはエラーになります起動するとAndroidManifest.xmlCamera Error: Could not connect to cameraandroid.hardware.Camera.Open()を使用すると、アプリがクラッシュするのはなぜですか?

権限は

<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 App Storeにこのアプリケーションの作業バージョンを持っていますので、そうです – Raid

+0

何のエラーが表示されていますか? –

答えて

1

問題を解決しました!

問題は単に大文字の問題でした。線<uses-permission android:name="android.permission.camera"/>は実際には<uses-permission android:name="android.permission.CAMERA"/>となります。これはcameraがハードウェア機能であり、CAMERAが許可であるために発生しました。

+0

これは最も迷惑な問題です。良い目。 – JoxTraex

1

manifestに宣言するだけでなく、あなたが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

を付与するため、以下のスニペットを使用するために、実行時にユーザーからpermissionを付与する必要があります適切なパーミッションとアンドロイドマニフェストでの使用を述べるには十分でしたが、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; 
    } 
} 
0123新規ターゲット用

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

関連する問題