Java android-尝试打开前摄像头时出现异常

Java android-尝试打开前摄像头时出现异常,java,android,android-intent,Java,Android,Android Intent,我无法获取前向摄像头(摄像头id 1)的图像打开cam#1失败在我尝试运行以下代码时出现在屏幕上 附上一个片段。任何帮助都将不胜感激(我正在Nexus4上试用) Tester.java package com.example.cam; import java.util.HashMap; import java.util.Iterator; import android.annotation.SuppressLint; import android.app.Activity; import an

我无法获取前向摄像头(摄像头id 1)的图像<代码>打开cam#1失败在我尝试运行以下代码时出现在屏幕上

附上一个片段。任何帮助都将不胜感激(我正在Nexus4上试用)

Tester.java

package com.example.cam;

import java.util.HashMap;
import java.util.Iterator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

public class Tester extends Activity {
    private static final int[] camIds = { Camera.CameraInfo.CAMERA_FACING_BACK, Camera.CameraInfo.CAMERA_FACING_FRONT };
    @SuppressLint("UseSparseArrays")
    private final HashMap<Integer, Camera> camMap = new HashMap<Integer, Camera>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!checkCameraHardware())
            finish();
        getCameras();
        releaseCamera();
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    @Override
    protected void onStop() {
        super.onStop();
        releaseCamera();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseCamera();
    }

    private final void doToast(final String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    private final void getCameras() {
        for (int camId : camIds)
            try {
                camMap.put(camId, Camera.open(camId));
                doToast("open cam #" + camId + " succeeded");
            } catch (Exception e) {
                doToast("open cam #" + camId + " failed");
            }
    }

    private final void releaseCamera() {
        final Iterator<Integer> iter = camMap.keySet().iterator();
        while (iter.hasNext())
            camMap.remove(iter.next()).release();
    }

    private final boolean checkCameraHardware() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
            return camIds.length <= Camera.getNumberOfCameras(); 
        else
            return false;
    }
}
package com.example.cam;
导入java.util.HashMap;
导入java.util.Iterator;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.content.pm.PackageManager;
导入android.hardware.Camera;
导入android.os.Bundle;
导入android.view.Menu;
导入android.widget.Toast;
公共类测试仪扩展活动{
private static final int[]camIds={Camera.CameraInfo.Camera_faceting_BACK,Camera.CameraInfo.Camera_faceting_FRONT};
@SuppressLint(“UseSparsearray”)
private final HashMap camMap=new HashMap();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
返回true;
}
@凌驾
受保护的void onResume(){
super.onResume();
如果(!checkCameraHardware())
完成();
getCameras();
松开摄像头();
}
@凌驾
受保护的void onPause(){
super.onPause();
松开摄像头();
}
@凌驾
受保护的void onStop(){
super.onStop();
松开摄像头();
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
松开摄像头();
}
专用最终void doToast(最终字符串消息){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
私人最终作废{
用于(int camId:camId)
试一试{
camMap.put(camId,Camera.open(camId));
doToast(“打开cam#”+camId+“成功”);
}捕获(例外e){
doToast(“打开cam#”+camId+“失败”);
}
}
私人最终无效释放摄影机(){
最终迭代器iter=camMap.keySet().Iterator();
while(iter.hasNext())
camMap.remove(iter.next()).release();
}
专用最终布尔检查CameraHardware(){
if(getPackageManager().hasSystemFeature(PackageManager.FEATURE\u摄像头))

返回camIds.length请共享完整的日志以进行跟踪。@Manmohan,对延迟表示抱歉,并感谢您的重播。我已在上发布了我的日志,但根据您的日志,我认为这意味着无法一次打开超过1个cam。我认为您应该避免使用循环打开摄影机代码,如果需要这样做,则应避免使用循环打开摄影机代码Manmohan,如果您没有上述问题的经验,那么为什么要请求日志呢?不迭代摄影机实例是一个愚蠢的想法,这就是为什么我们在编程中使用泛型,以便以相同的方式处理所有对象(有一个接口).无论如何,谢谢你。你可以试着向别人推荐。想一想如何一次打开/使用多个摄像头,这就是为什么我建议,我以为你已经忘记了这个事实。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cam"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
    <uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />
    <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.cam.Tester"
            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>