Android活动无法启动Componentinfo

时间:2015-01-21 15:53:42

标签: android android-activity android-camera

我已经尝试过谷歌很多但是找不到单一的解决方案 当我在我的设备上运行它时,它提供了以下异常,从本网站获取本教程,用前置摄像头捕获图像而不在屏幕上显示图片here is the link

logcat的

    04-09 07:35:13.181  12257-12257/com.example22.dell.magicgoodapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example22.dell.magicgoodapp, PID: 12257
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example22.dell.magicgoodapp/com.example22.dell.magicgoodapp.MainActivity}: java.lang.RuntimeException: Fail to connect to camera service
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
            at android.os.Handler.dispatchMessage(Handler.java:110)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:5292)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.RuntimeException: Fail to connect to camera service
            at android.hardware.Camera.native_setup(Native Method)
            at android.hardware.Camera.<init>(Camera.java:469)
            at android.hardware.Camera.open(Camera.java:424)
            at com.example22.dell.magicgoodapp.MainActivity.onCreate(Unknown Source)
            at android.app.Activity.performCreate(Activity.java:5264)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
              at android.app.ActivityThread.performLaunchActivity
     (ActivityThread.java:2302)
              at  android.app.ActivityThread.handleLaunchActivity
      (ActivityThread.java:2390)
              at android.app.ActivityThread.access$800\
     (ActivityThread.java:151)
              at   android.app.ActivityThread$H.handleMessage
     (ActivityThread.java:1321)
              at android.os.Handler.dispatchMessage(Handler.java:110)
              at android.os.Looper.loop(Looper.java:193)
              at android.app.ActivityThread.main(ActivityThread.java:5292)
              at java.lang.reflect.Method.invokeNative(Native Method)
              at java.lang.reflect.Method.invoke(Method.java:515)
              at    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
         (ZygoteInit.java:824)
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
              at dalvik.system.NativeStart.main(Native Method)

MainActivity

package com.example22.dell.magicgoodapp;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
    final static String DEBUG_TAG = "MainActivity";
    private Camera camera;
    private int cameraId = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // do we have a camera?
        if (!getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
            Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG)
                    .show();
        } else {
            cameraId = findFrontFacingCamera();
            if (cameraId < 0) {
                Toast.makeText(this, "No front facing camera found.",
                        Toast.LENGTH_LONG).show();
            } else {
                camera = Camera.open(cameraId);
            }
        }
    }

    public void onClick(View view) {
        camera.takePicture(null, null,
                new PhotoHandler(getApplicationContext()));
    }

    private int findFrontFacingCamera() {
        int cameraId = -1;
        // Search for the front facing camera
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) {
            CameraInfo info = new CameraInfo();
            Camera.getCameraInfo(i, info);
            if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
                Log.d(DEBUG_TAG, "Camera found");
                cameraId = i;
                break;
            }
        }
        return cameraId;
    }

    @Override
    protected void onPause() {
        if (camera != null) {
            camera.release();
            camera = null;
        }
        super.onPause();
    }

   }

PhotoHandler类

package com.example22.dell.magicgoodapp;

/**
 * Created by DELL on 1/21/2015.
 */
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

public class PhotoHandler implements PictureCallback {

    private final Context context;

    public PhotoHandler(Context context) {
        this.context = context;
    }

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFileDir = getDir();

        if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

            Log.d(MainActivity.DEBUG_TAG, "Can't create directory to save image.");
            Toast.makeText(context, "Can't create directory to save image.",
                    Toast.LENGTH_LONG).show();
            return;

        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
        String date = dateFormat.format(new Date());
        String photoFile = "Picture_" + date + ".jpg";

        String filename = pictureFileDir.getPath() + File.separator + photoFile;

        File pictureFile = new File(filename);

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
            Toast.makeText(context, "New Image saved:" + photoFile,
                    Toast.LENGTH_LONG).show();
        } catch (Exception error) {
            Log.d(MainActivity.DEBUG_TAG, "File" + filename + "not saved: "
                    + error.getMessage());
            Toast.makeText(context, "Image could not be saved.",
                    Toast.LENGTH_LONG).show();
        }
    }

    private File getDir() {
        File sdDir = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        return new File(sdDir, "CameraAPIDemo");
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您尚未在清单中声明权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

答案 1 :(得分:0)

已建议检查权限。

如果相机没有通过相机访问的其他尝试释放相机,它也可能处于不良状态。这发生在早期开发中。

使用当前设置重新启动手机是否值得查看相机是否已按住。或者检查默认相机,看它是否加载或出错。这是一个很好的检查机制。

您目前在onPause()生命周期中有一个版本,这应该是您希望在正确的时间停止它的内容。但也许你在最初的开发过程中并没有这样做,现在处于糟糕的状态。