2016-12-29 71 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我在亞馬遜應用商店有這個應用程序的工作版本,所以是 – Raid

+0

你得到什麼錯誤? –

回答

1

問題解決了!

這個問題只是一個大寫的問題。該行<uses-permission android:name="android.permission.camera"/>實際上應該讀取<uses-permission android:name="android.permission.CAMERA"/>。發生這種情況是因爲camera是硬件功能,而CAMERA是一個權限。

+0

這些是最令人討厭的問題。好眼睛。 – JoxTraex

1

不僅宣佈在manifest但你也需要在運行時從用戶授予permissionAndroid 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

相關問題