Android的Camera.takePicture失败 [英] Android Camera.takePicture failed

查看:256
本文介绍了Android的Camera.takePicture失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

作为一个有点学习的过程中,我正在写一个安全的应用程序,当任意一个事件发生,需要打开相机,拍照,并打开相机电源,无需担心闪光灯,对焦,或显示preVIEW。我跟着沿在线演示,并提出了工作的应用程序,拍照,但它使用previews和所有。于是我开始努力得到它没有preVIEW工作。无论如何,我不断收到takePicture失败的例外,我也没有世俗知道为什么。我希望有人与照相机API的更多经验可以看看,并指出我在一个解决方案的方向发展。以下是我的相关文件。我使用的是最新的Andr​​oid Studio和测试上的Galaxy S4。

[MainActivity.java]

 包com.g5digital.cam2;

进口android.content.pm.PackageManager;
进口android.hardware.Camera;
进口android.support.v7.app.ActionBarActivity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.Button;
进口android.widget.LinearLayout;
进口android.widget.Toast;

进口java.io.IOException异常;

公共类MainActivity扩展ActionBarActivity实现View.OnClickListener {

    私有静态最后字符串变量=MainActivity;
    私人Button按钮;
    私人诠释cameraId;
    私人摄像头摄像头;
    私人相机preVIEW凸轮preVIEW;
    私人的LinearLayout容器;
    私人Camera.Parameters camParms;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        容器=(的LinearLayout)findViewById(R.id.container);

        按钮=(按钮)findViewById(R.id.button);
        button.setOnClickListener(本);
    }


    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        INT的id = item.getItemId();
        如果(ID == R.id.action_settings){
            返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }

    @覆盖
    公共无效的onClick(视图查看){
        开放式摄像头();

        尝试 {
            如果(相机!= NULL){
                PhotoHandler pH值=新PhotoHandler(本,摄像头);
                camera.takePicture(NULL,NULL,pH值);

                //评论,直到takePicture()工程
                / *(新处理程序())。postDelayed(新可运行(){
                    @覆盖
                    公共无效的run(){
                        MainActivity.this.closeCamera();
                    }
                },1000); * /
            }
        }
        赶上(例外五){
            closeCamera();
            Log.d(TAG,e.getMessage());
            e.printStackTrace();
        }
    }

    私人无效openCamera(){
        //我们有一个摄像头?
        如果(!getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            Toast.makeText(这一点,没有这个设备上的摄像头,Toast.LENGTH_LONG)
                    。显示();
        }
        其他 {
            closeCamera();

            cameraId = findFrontFacingCameraId();
            如果(cameraId℃,){
                Toast.makeText(这一点,没有前置摄像头发现。
                        Toast.LENGTH_LONG).show();
            } 其他 {
                摄像头= Camera.open(cameraId);
                尝试 {
                    setCamParms();

                    setCam preVIEW();
                    camera.start preVIEW();
                }
                赶上(例外五){
                    closeCamera();
                    e.printStackTrace();
                    完();
                    返回;
                }
            }
        }
    }

    私人无效closeCamera(){
        如果(相机!= NULL){
            camera.release();
            摄像头= NULL;
        }
    }

    私人诠释findFrontFacingCameraId(){
        INT camera_id = -1;
        //搜索的前置摄像头
        INT numberOfCameras = Camera.getNumberOfCameras();
        的for(int i = 0; I< numberOfCameras;我++){
            Camera.CameraInfo信息=新Camera.CameraInfo();
            Camera.getCameraInfo(ⅰ,信息);
            如果(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
                Log.d(TAG相机找到);
                camera_id =我;
                打破;
            }
        }
        返回camera_id;
    }

    私人无效setCamParms(){
        如果(camParms == NULL和放大器;&安培;!摄像头= NULL){
            camParms = camera.getParameters();
            camParms.setFlashMode(关);
        }
        如果(相机!= NULL){
            camera.setParameters(camParms);
            camera.setDisplayOrientation(90);
        }
    }

    私人无效setCam preVIEW()抛出IOException异常{
        如果(CAM preVIEW == NULL和放大器;&安培;!摄像头= NULL){
            凸轮preVIEW =新相机preVIEW(本,摄像头);
        }
        如果(相机!= NULL){
            camera.set previewDisplay(CAM preview.getHolder());
        }
    }
}
 

[相机preview.java]

 包com.g5digital.cam2;

进口android.content.Context;
进口android.hardware.Camera;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;

进口java.io.IOException异常;

公共类相机preVIEW延伸SurfaceView实现SurfaceHolder.Callback {
    私人上下文的背景下;
    私人摄像头摄像头;
    私人SurfaceHolder持有人;
    私有静态最后字符串变量=相机preVIEW;

    公共摄像头preVIEW(上下文C,照相机CAM){
        超级(C);
        上下文= C;
        摄像头=凸轮;
        支架= getHolder();
        holder.addCallback(本);
    }

    @覆盖
    公共无效surfaceCreated(SurfaceHolder surfaceHolder){
        尝试 {
            camera.set previewDisplay(保持器);
            camera.start preVIEW();
        }赶上(IOException异常E){
            Log.d(TAG,错误设置摄像头preVIEW:+ e.getMessage());
        }赶上(例外五){
            //可能得到所谓释放后()消息
            e.printStackTrace();
        }
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder surfaceHolder,诠释我,诠释I2,I3 INT){
        //如果你的preVIEW可以改变或旋转,把这些事件的关心在这里。
        //确保调整或重新格式化之前停止preVIEW。

        如果(holder.getSurface()== NULL){
            // preVIEW表面不存在
            返回;
        }

        在进行更改之前//停止preVIEW
        尝试 {
            camera.stop preVIEW();
        }赶上(例外五){
            //忽略:试图阻止一个不存在的preVIEW
        }

        //设置preVIEW大小并进行调整大小,旋转或
        //重新格式化的变化在这里

        //启动preVIEW使用新设置
        尝试 {
            camera.set previewDisplay(保持器);
            camera.start preVIEW();

        }赶上(例外五){
            Log.d(TAG,错误启动摄像头preVIEW:+ e.getMessage());
        }
    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder surfaceHolder){
        //
    }
}
 

[PhotoHandler.java]

 包com.g5digital.cam2;

进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.Matrix;
进口android.hardware.Camera;
进口android.os.Environment;
进口android.util.Log;
进口android.widget.Toast;

进口的java.io.File;
进口java.io.FileOutputStream中;
进口java.text.SimpleDateFormat的;
进口java.util.Date;

公共类PhotoHandler实现Camera.PictureCallback {
    私人最终上下文的背景下;
    私人最终摄像头摄像头;

    公共PhotoHandler(上下文的背景下,相机C){
        this.context =背景;
        this.camera = C;
    }

    @覆盖
    公共无效onPictureTaken(byte []的字节数,照相机CAM){
        Log.i(PhotoHandler,摄!);
        文件pictureFileDir = GETDIR();

        如果(pictureFileDir.exists()及!&安培;!pictureFileDir.mkdirs()){

            Log.d(PhotoHandler,无法创建目录保存图像。);
            Toast.makeText(背景下,无法创建目录保存图像。
                    Toast.LENGTH_LONG).show();
            返回;

        }

        BMP位= BitmapFactory.de codeByteArray(字节,0,bytes.length);
        INT宽度= bmp.getWidth();
        INT高= bmp.getHeight();
        字模=新的Matrix();
        matrix.postRotate(270);
        位图rotatedBitmap = Bitmap.createBitmap(BMP,0,0,
                宽度,高度,矩阵,真);

        SimpleDateFormat的日期格式=新的SimpleDateFormat(YYYYMMDDHHMMSS);
        字符串日期= dateFormat.format(新日期());
        字符串photoFile =Picture_+日期+.JPG;

        字符串文件名= pictureFileDir.getPath()+文件分割符+ photoFile;

        文件PictureFile的=新的文件(文件名);

        尝试 {
            FileOutputStream中FOS =新的FileOutputStream(PictureFile的);
            布尔结果= rotatedBitmap.com preSS(Bitmap.Com pressFormat.JPEG,90,FOS);
            //fos.write(bytes);
            fos.close();
            如果(结果){
                Toast.makeText(背景下,新形象保存:+ photoFile,
                        Toast.LENGTH_LONG).show();
            }
            其他 {
                Toast.makeText(背景下,无法保存图像:+ photoFile,
                        Toast.LENGTH_LONG).show();
            }
            camera.start preVIEW();
        }赶上(异常错误){
            Log.d(PhotoHandler,文件+文件名+未保存
                    + error.getMessage());
            Toast.makeText(背景下,图像无法被保存。
                    Toast.LENGTH_LONG).show();
        }
    }

    私人文件GETDIR(){
        文件sdDir =环境
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        返回新的文件(sdDir,CameraAPIDemo);
    }
}
 

[AndroidManifest.xml中]

 < XML版本=1.0编码=UTF-8&GT?;
<舱单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=com.g5digital.cam2>

    <使用-权限的Andr​​oid:名称=android.permission.CAMERA/>
    <使用-权限的Andr​​oid:名称=android.permission.FLASHLIGHT/>
    <使用-权限的Andr​​oid:名称=android.permission.READ_EXTERNAL_STORAG​​E/>
    <使用-权限的Andr​​oid:名称=android.permission.WRITE_EXTERNAL_STORAG​​E/>
    <使用特征的android:NAME =android.hardware.camera/>
    <使用特征的android:NAME =android.hardware.camera.autofocus/>

    <应用
        机器人:allowBackup =真
        机器人:图标=@可绘制/ ic_launcher
        机器人:标签=@字符串/ APP_NAME
        机器人:主题=@风格/ AppTheme>
        <活动
            机器人:名称=com.g5digital.cam2.MainActivity
            机器人:标签=@字符串/ APP_NAME
            机器人:screenOrientation =画像>
            <意向滤光器>
                <作用机器人:名称=android.intent.action.MAIN/>

                <类机器人:名称=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;
    < /用途>

< /舱单>
 

[activity_main.xml]

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:ID =@ + ID /容器
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直
    工具:上下文=com.g5digital.cam2.MainActivity
    工具:忽略=MergeRootFrame>

    <按钮
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=@字符串/点击
        机器人:ID =@ + ID /键/>
< / LinearLayout中>
 

[LogCat中输出]

  01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 D / MainActivity:takePicture失败
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:java.lang.RuntimeException的:takePicture失败
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.hardware.Camera.native_takePicture(本机方法)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.hardware.Camera.takePicture(Camera.java:1194)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.hardware.Camera.takePicture(Camera.java:1139)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在com.g5digital.cam2.MainActivity.onClick(MainActivity.java:66)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.view.View.performClick(View.java:4475)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.view.View $ PerformClick.run(View.java:18786)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.os.Handler.handleCallback(Handler.java:730)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.os.Handler.dispatchMessage(Handler.java:92)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.os.Looper.loop(Looper.java:137)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在android.app.ActivityThread.main(ActivityThread.java:5419)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在java.lang.reflect.Method.invokeNative(本机方法)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在java.lang.reflect.Method.invoke(Method.java:525)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1187)
01-29 14:55:45.826 5853-5853 / com.g5digital.cam2 W / System.err的:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
01-29 14:55:45.836 5853-5853 / com.g5digital.cam2 W / System.err的:在dalvik.system.NativeStart.main(本机方法)
 

解决方案

没有,采取图片您必须显示preVIEW。还有由熟练的人们发明了不少解决方法,例如见拍照没有preVIEW机器人,  <一href="http://stackoverflow.com/questions/14277981/android-is-it-possible-to-take-a-picture-with-the-camera-from-a-service-with-no">Android:是否有可能采取与相机拍摄照片从服务没有用户界面,<一个href="http://stackoverflow.com/questions/7398897/how-to-use-camera-to-take-picture-in-a-background-service-on-android">How使用相机拍摄照片在Android上后台服务? ...

但是请记住,要求是不是技术,而是隐私的目的。而该系统的不断发展和防止新发现的变通方法。

也许是最可靠的方法来隐藏preVIEW在S4是使用表面纹理,但无形之中显示出来,如:移出去口中。

As a bit of a learning exercise, I'm writing a security app that, when an arbitrary event happens, needs to turn the camera on, take a picture, and turn the camera off, without worrying about flash, focus, or displaying a preview. I followed along the online demos and made a working app that takes a picture, but it uses previews and all that. So I started working on getting it to work without a preview. Anyway, I keep getting 'takePicture failed' exceptions, and I have no earthly idea why. I was hoping someone with more experience with the Camera API could take a look and point me in the direction of a solution. Below are my pertinent files. I'm using the latest Android Studio and testing on Galaxy S4.

[MainActivity.java]

package com.g5digital.cam2;

import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.IOException;

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private Button button;
    private int cameraId;
    private Camera camera;
    private CameraPreview camPreview;
    private LinearLayout container;
    private Camera.Parameters camParms;

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

        container = (LinearLayout)findViewById(R.id.container);

        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View view) {
        openCamera();

        try {
            if (camera != null) {
                PhotoHandler ph = new PhotoHandler(this, camera);
                camera.takePicture(null, null, ph);

                // Commented until takePicture() works
                /*(new Handler()).postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        MainActivity.this.closeCamera();
                    }
                }, 1000);*/
            }
        }
        catch (Exception e) {
            closeCamera();
            Log.d(TAG, e.getMessage());
            e.printStackTrace();
        }
    }

    private void openCamera() {
        // do we have a camera?
        if (!getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
            Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG)
                    .show();
        }
        else {
            closeCamera();

            cameraId = findFrontFacingCameraId();
            if (cameraId < 0) {
                Toast.makeText(this, "No front facing camera found.",
                        Toast.LENGTH_LONG).show();
            } else {
                camera = Camera.open(cameraId);
                try {
                    setCamParms();

                    setCamPreview();
                    camera.startPreview();
                }
                catch (Exception e) {
                    closeCamera();
                    e.printStackTrace();
                    finish();
                    return;
                }
            }
        }
    }

    private void closeCamera() {
        if (camera != null) {
            camera.release();
            camera = null;
        }
    }

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

    private void setCamParms() {
        if (camParms == null && camera != null) {
            camParms = camera.getParameters();
            camParms.setFlashMode("Off");
        }
        if (camera != null) {
            camera.setParameters(camParms);
            camera.setDisplayOrientation(90);
        }
    }

    private void setCamPreview() throws IOException {
        if (camPreview == null && camera != null) {
            camPreview = new CameraPreview(this, camera);
        }
        if (camera != null) {
            camera.setPreviewDisplay(camPreview.getHolder());
        }
    }
}

[CameraPreview.java]

package com.g5digital.cam2;

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private Context context;
    private Camera camera;
    private SurfaceHolder holder;
    private static final String TAG = "CameraPreview";

    public CameraPreview(Context c, Camera cam) {
        super(c);
        context = c;
        camera = cam;
        holder = getHolder();
        holder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        } catch (Exception e) {
            // Probably getting "called after release()" message
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (holder.getSurface() == null){
            // preview surface does not exist
            return;
        }

        // stop preview before making changes
        try {
            camera.stopPreview();
        } catch (Exception e){
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        //
    }
}

[PhotoHandler.java]

package com.g5digital.cam2;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PhotoHandler implements Camera.PictureCallback {
    private final Context context;
    private final Camera camera;

    public PhotoHandler(Context context, Camera c) {
        this.context = context;
        this.camera = c;
    }

    @Override
    public void onPictureTaken(byte[] bytes, Camera cam) {
        Log.i("PhotoHandler", "Picture taken!");
        File pictureFileDir = getDir();

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

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

        }

        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        Matrix matrix = new Matrix();
        matrix.postRotate(270);
        Bitmap rotatedBitmap = Bitmap.createBitmap(bmp, 0, 0,
                width, height, matrix, true);

        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);
            boolean result = rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
            //fos.write(bytes);
            fos.close();
            if (result) {
                Toast.makeText(context, "New Image saved:" + photoFile,
                        Toast.LENGTH_LONG).show();
            }
            else {
                Toast.makeText(context, "Couldn't save image:" + photoFile,
                        Toast.LENGTH_LONG).show();
            }
            camera.startPreview();
        } catch (Exception error) {
            Log.d("PhotoHandler", "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");
    }
}

[AndroidManifest.xml]

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.g5digital.cam2" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.g5digital.cam2.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

[activity_main.xml]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.g5digital.cam2.MainActivity"
    tools:ignore="MergeRootFrame">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/click"
        android:id="@+id/button" />
</LinearLayout>

[LogCat output]

01-29 14:55:45.826    5853-5853/com.g5digital.cam2 D/MainActivity﹕ takePicture failed
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ java.lang.RuntimeException: takePicture failed
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.hardware.Camera.native_takePicture(Native Method)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.hardware.Camera.takePicture(Camera.java:1194)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.hardware.Camera.takePicture(Camera.java:1139)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at com.g5digital.cam2.MainActivity.onClick(MainActivity.java:66)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.view.View.performClick(View.java:4475)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.view.View$PerformClick.run(View.java:18786)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:730)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5419)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
01-29 14:55:45.826    5853-5853/com.g5digital.cam2 W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
01-29 14:55:45.836    5853-5853/com.g5digital.cam2 W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

解决方案

No, to take picture you must show preview. There are quite a few workarounds invented by skillful people, see e.g. Take Picture without preview android, Android: Is it possible to take a picture with the camera from a service with no UI, How to use Camera to take picture in a background Service on Android?...

But keep in mind that the requirement is not for technical, but privacy purposes. And the system continues to evolve and protect against newly found workarounds.

Maybe the most robust way to hide preview on S4 is to use SurfaceTexture, but display it invisibly, e.g. shifted off viewport.

这篇关于Android的Camera.takePicture失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆