Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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 用相机拍照有20%的时间失败_Android_Cordova_Camera_Cyanogenmod - Fatal编程技术网

Android 用相机拍照有20%的时间失败

Android 用相机拍照有20%的时间失败,android,cordova,camera,cyanogenmod,Android,Cordova,Camera,Cyanogenmod,这是我装照相机的小包装。我这样称呼它: var camera = { settings : { quality : 50, targetWidth : 1024, targetHeight : 1024, correctOrientation : true } }; var error = function(message) { alert("Error happened while trying to get a picture", message)

这是我装照相机的小包装。我这样称呼它:

var camera = {
  settings : {
    quality : 50,
    targetWidth : 1024,
    targetHeight : 1024,
    correctOrientation : true
  }
};
var error = function(message) {
  alert("Error happened while trying to get a picture", message);
};
document.addEventListener("deviceready", function() {
  camera.toFile = function() {
    this.settings.destinationType = navigator.camera.DestinationType.FILE_URI;
    return this;
  },
  camera.toBase64 = function() {
    this.settings.destinationType = navigator.camera.DestinationType.DATA_URL;
    return this;
  },
  camera.fromCamera = function() {
    this.settings.sourceType = navigator.camera.PictureSourceType.CAMERA;
    return this;
  };
  camera.fromLibrary = function() {
    this.settings.sourceType = navigator.camera.PictureSourceType.PHOTOLIBRARY;
    return this;
  };
  camera.fromPhotoAlbum = function() {
    this.settings.sourceType = navigator.camera.PictureSourceType.SAVEDPHOTOALBUM;
    return this;
  }
  camera.get = function(callback) {
    navigator.camera.getPicture(function(data) {
      alert("taking a picture successful");
      callback(data);
    }, error, camera.settings);
  };
}, false);
大约20%的情况下,不会调用“警报(“拍照成功”);”,但不会显示错误。如果我取消拍照,将显示一条警告消息“尝试拍照时出错”,因此错误回调将正常工作

基本上什么也没发生。我已经在CM9上的三星Galaxy S2和全新的HTC One X上进行了测试。

最近,我回答了同样的问题。我们在我的公司遇到了这个问题并解决了。与Phonegap相比,它更多地与Android系统有关

当你启动相机时,你的应用程序会进入onStop()。在那里,如果你的应用程序需要内存,Android系统有权关闭它。当相机拍照并将其转储到内存中时,内存通常会变低,所以当用户拍照时,应用程序很有可能会被杀死

现在你的应用程序已经死机,当相机完成后,它会重新启动你的应用程序。这就是为什么它的行为如此怪异;摄像头会返回到你的应用程序中,但与之前的实例不同,因此你的回调永远不会被调用,因为它已经不存在了

你可以通过降低图片的质量并通过URI而不是数据传递给你的应用程序来降低这种情况发生的频率,但问题不会完全消失

为了解决永远不会发生的回调问题,我们制作了一个Java回调,它启动相机并在每次拍摄时将图片保存到同一位置。然后,当应用程序从被杀开始备份时,它会在该位置查找图片

对于一个愚蠢的问题来说,这是一个奇怪的解决方案,但如果你的应用程序被杀死,摄像头回调就不会发生。如果您需要关于如何使用Java回调来实现这一点的更多信息,请告诉我,我将把代码放在这里。否则,请查看以了解更多信息

编辑:以下是我们在主要DroidGap活动中使用的代码:

camera.fromPhotoAlbum().toBase64().get(function(base64){});
然后,在JavaScript中,您可以使用以下命令调用摄影机:

private static final String folderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/appName";
private static final String filePath = "phonegapImage.jpg";

@Override
public void onCreate(Bundle savedState) {
    //...The rest of onCreate, this makes the Java available in JavaScript
    appView.addJavascriptInterface(this, "Camera");
}

public void takePhoto(final String callback) {
    Log.v("Camera Plugin", "Starting takePhoto callback");

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(folderPath, filePath)));
    startActivityForResult(intent, TAKE_PICTURE);
}

public String getPhotoUri() {
    return Uri.fromFile(new File(folderPath, filePath)).toString();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case TAKE_PICTURE:
            if (resultCode == Activity.RESULT_OK) {
                //Do whatever you need to do when the camera returns
                //This is after the picture is already saved, we return to the page
            }
            break;
        default:
            Log.v("Camera", "Something strange happened...");
            break;
    }
}

就这样。只需确保将所有路径/文件/页面/等名称更改为您希望在应用程序中使用的名称。这将在每次拍摄照片时覆盖该图像,但如果您不想这样做,您可能会想出一些方法来动态命名它们。您可以像使用JavaScript中的任何其他路径一样使用该URI。

谢谢您的回答,我很想看看您编写的java代码:)我想应该是:
static final int take\u PICTURE=1
Camera.takePhoto("onPhotoURISuccess");
//Then, to get the location of the photo after you take it and load the page again
var imgPath = Camera.getPhotoUri();