2011-10-19 99 views
35

我正試圖訪問手機上的相機。在將代碼放入小部件之前,我正在編寫一個簡單的存根應用程序。我不是很遠。該代碼總是拋出一個運行時異常「無法連接到相機的服務」的出錯代碼(從commonsware例如捏)是:無法連接到相機服務

@Override 
    public void onResume() { 
     super.onResume(); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
      Camera.CameraInfo info = new Camera.CameraInfo(); 
      for (int i = 0; i < Camera.getNumberOfCameras(); i++) { 
       Camera.getCameraInfo(i, info); 
       if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 
        try { 
         // Gets to here OK 
         camera = Camera.open(i); 
        } catch (Exception e) { 
         e.printStackTrace(); 
         // throws runtime exception :"Failed to connect to camera service" 
        } 
       } 
      } 
     } 
} 

,我的清單是(修正10月20日)

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.nbt.cameratest" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="9" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:name=".CameraTestActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

      <uses-permission android:name="android.permission.CAMERA" /> 
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    </application> 
</manifest> 

任何人都可以請建議什麼可能是錯的?

UPDATE 10月20日

的logcat在SDK 4.0壞了,不會顯示在日誌的末尾,所以我剪了該位是最好的,我可以從命令行亞行logcat:

W/ServiceManager(2588): Permission failure: android.permission.CAMERA from uid=10136 pid=5744 
E/CameraService(2588): Permission Denial: can't use the camera pid=5744, uid=10136 
W/System.err(5744): java.lang.RuntimeException: Fail to connect to camera service 
W/System.err(5744): at android.hardware.Camera.native_setup(Native Method) 
W/System.err(5744): at android.hardware.Camera.<init>(Camera.java:294) 
W/System.err(5744): at android.hardware.Camera.open(Camera.java:255) 
etc.. 

我不知道爲什麼我沒有,因爲它是在清單

+0

你能否給我們帶有例外的Logcat輸出? –

+0

現在沒有什麼可看的,因爲異常現在在catch塊中顯示爲'null'!?正如問題標題中所述。 logcat只顯示一個NPE。 – NickT

+0

因此異常拋出你正在調用Camera.Open()? –

回答

42

幾件事情聲明權限:

  1. 爲什麼您的使用權限和使用功能標籤在您的活動標籤中。一般來說,權限包含在您的<manifest>標記的直接子項中。這可能是問題的一部分。

  2. 根據Android的camera open documentation,運行時異常被拋出:

    如果連接到相機服務失敗(例如,如果相機是由另一個進程或設備策略管理器使用已禁用相機)

    您是否嘗試過檢查相機是否正在被別的東西使用,或者您的策略管理器是否有一些相機關閉的設置?

  3. 不要忘記用於自動對焦的<uses-feature android:name="android.hardware.camera.autofocus" />

雖然我不確定這些是否能夠直接幫助你,但我認爲他們值得調查,除了簡單排除外,沒有別的原因。盡職調查,如果你願意。

編輯 正如以下評論中所述,解決方案是將uses-permissions移動到應用程序標籤上方。

+0

您對清單的正確性,我在切割和粘貼中的錯誤。它沒有任何區別,但(見我的編輯)。它看起來像Eclipse中的最新SDK的logcat已經損壞了,所以我使用了命令行 - 這是一個權限錯誤,但沒有其他進程正在使用它,據我所知。 – NickT

+7

解決了!將用戶權限移至應用程序標籤上方。我一直把它們放在清單的底部,它們對LOCATIONS和INTERNET等東西都起作用。很奇怪。 – NickT

+0

所以問題是像我說的權限? –

20

確保在不再需要相機時調用release()方法釋放相機,否則將無法使用相機。也許作爲一個理智的檢查,看看你的普通相機是否工作。如果它說失敗,那麼你以前的嘗試在runni

2

運行你的代碼100次可能會影響相機的功能錯誤。您的活動可能正常執行,但系統無法購買它,因此相機部隊停止。 所有錯過的一個主要提示是重新啓動你的手機,不只是日食..它爲我工作..

+2

如果你有這些問題,你真的需要考慮適當地釋放相機和其他資源。在最終用戶應該能夠儘可能多地重新啓動您的應用程序,而無需重新啓動他們的設備。更何況他們可能有其他相機應用程序正在使用。 – hcpl

6

我知道這個問題已被回答很久以前,但我想添加一個小東西。

具有相同的錯誤大家,請務必在您添加此權限清單文件:

<uses-permission android:name="android.permission.CAMERA" /> 

重要使用大寫字母CAMERA,因爲我曾與小寫字母許可並沒有奏效。

+0

我想要另外一件事。對於xamarin用戶,相應的是int所需的權限列表中的droid項目的屬性選項卡 – eka808

31

對於支持每個應用程序設置權限的新版android版本(自Marshmallow 6.0以來),相機的權限可以被禁用,應該從應用程序設置啓用。

+2

謝謝sam。這實際上是我的問題。真的很煩人,在Android 6.0中沒有提供開發所需的權限。 – vrunoa

+1

這是一個讚賞的額外迴應。直到我的Nexus 5得到更新後,我才知道這個問題,並且在意外拒絕服務後我開始看到這個彈出窗口。這也意味着用戶應該回到較早的應用程序,並在支持所需功能的舊應用程序上處理這些RuntimeException錯誤。 –

+0

你可以發佈一些代碼或鏈接到解決方案,我還不熟悉棉花糖許可。 – Anthony

4

該問題與權限有關。將以下代碼複製到onCreate()方法中。問題將得到解決。

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

之後,等待用戶操作並處理他的決定。

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case CAMERA_PERMISSION_REQUEST_CODE: 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //Start your camera handling here 
      } else { 
       AppUtils.showUserMessage("You declined to allow the app to access your camera", this); 
      } 
    } 
} 
-1

我有同樣的問題。試過這裏提到的所有解決方案,但沒有任何工作。所以我重新啓動了設備,突然間問題解決了。

相關問題