Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 摄像头API在Jelly Bean上工作,但不是Kitkat_Android_Android Camera_Android Camera Intent - Fatal编程技术网

Android 摄像头API在Jelly Bean上工作,但不是Kitkat

Android 摄像头API在Jelly Bean上工作,但不是Kitkat,android,android-camera,android-camera-intent,Android,Android Camera,Android Camera Intent,我有一个很奇怪的问题。我用下面的代码在点击按钮时拍照。它可以在果冻豆手机上正常工作,但不能在Kitkat上正常工作: MainActivity.java: package com.example.takepic; import android.app.Activity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.CameraIn

我有一个很奇怪的问题。我用下面的代码在点击按钮时拍照。它可以在果冻豆手机上正常工作,但不能在Kitkat上正常工作:

MainActivity.java

package com.example.takepic;

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.Button;
import android.widget.Toast;


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

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  capture = (Button)findViewById(R.id.captureBack);
  capture.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
         camera.startPreview(); //After this, nothing gets printed, and picture does not get taken
        System.out.println("Camera preview has started.");
            camera.takePicture(null, null, new PhotoHandler(getApplicationContext()));
    }
});
// 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 = findBackFacingCamera();
  if (cameraId < 0) {
    Toast.makeText(this, "No back facing camera found.",
        Toast.LENGTH_LONG).show();
  } else {
    camera = Camera.open(cameraId);
  }
}
  }



 private int findBackFacingCamera() {
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_BACK) {
    Log.d(DEBUG_TAG, "Camera found");
    cameraId = i;
    break;
  }
}
return cameraId;
}

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

} 
package com.example.takepic;



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();
  Toast.makeText(context, "Entered onPictureTaken", Toast.LENGTH_LONG).show();
   if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

  Log.d("Directory error", "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("File saving error", "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_DOWNLOADS);
 File sdDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
 Toast.makeText(context, ("Path : "+sdDir.getAbsolutePath()), Toast.LENGTH_LONG).show();
  return sdDir;
 }
} 
清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.takepic"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.takepic.MainActivity"
        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>
我怀疑问题在于takePicture API,但我无法调试它

编辑
经过进一步分析,我找到了问题的原因。成功调用了PhotoHandler对象,但没有调用onPictureTaken方法,可能是因为它没有获取相机单击图片的信息。我不知道为什么。

KitKat的垃圾收集工作方式与以前的API不同

我猜传递给
takePicture()
方法的
PhotoHandler
对象在调用
onPictureTaken
之前正在收集垃圾

尝试将
PhotoHandler
对象作为
MainActivity
中的实例变量

在班级的第一名:

PhotoHandler photoHandler;
然后在
onCreate()中

然后调用
takePicture()


在清单文件中添加
使用功能

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


看看这个。这可能会对您有所帮助。

我注意到您没有为相机指定任何曲面支架。为摄影机提供预览曲面非常重要

根据这里的文件:

遵循文档建议的代码。在没有预览的情况下拍照是一个很大的安全问题。Android的家伙可能已经在kitkat中修复了这个问题

粘贴到此处时,您可能错过了该部分代码,因此,作为一个额外的问题,请检查您是否正在SurfaceHolder的回调方法“onSurfaceCreated”中执行代码“camera.takePicture(null,null,callback)”


您可以在上述链接中获得所有相关代码

检查下面的链接帮助您我的问题不在gallery中。。最有可能的是takePicture API。此外,我也没有收到类似于那篇文章的任何异常。你有没有尝试附加一个调试器并单步通过它来查看它的去向?没有。。你能给我一个链接告诉我怎么做吗?我试过你的方法,它不起作用。当你对PhotoHandler说“在类的顶端”时,你的意思是作为一个类成员还是在类之外?类成员-它们在Java中被称为实例变量事实上这只发生在KitKat上,这让我99%确信有些东西被垃圾收集得太早了。例如,可以是OnClickListener。这取决于你用调试器和断点或者一堆日志告诉你什么东西不应该是空的。马特·洛根,你能帮我看看你的链接吗?帮了我很多忙:)我犯的主要错误是没有指定曲面保持器。显然,这是Kitkat手机的必需品,而在JB手机中没有它也可以工作。。谢谢你的帮助。:)
photoHandler = new PhotoHandler(getApplicationContext());
camera.takePicture(null, null, photoHandler);
<uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />