java - API 22 相机按 Intent 发布

标签 java android camera

我正在开发一个 android 应用程序,目前最小 sdk 为 19,并试图一直支持到 26。这周我在 Activity 中添加了相机功能,我发现它非常具有挑战性调试这个。

基本上,用户点击相机图标,它通过一个 intent 启动 android 相机,用户拍摄照片,将其保存,然后添加到他们在启动相机 intent 之前查看的 slider 图库。

所以我终于让它在 API 19、21、23、24、25 和 26 上运行......唯一给我一个问题的 API 是 22,我真的不知道为什么。当我单击相机图标时,它会启动 Intent,相机加载到白屏,然后应用程序崩溃。更重要的是,我刚刚尝试过它并且成功了,现在应用程序成功拍摄了照片,保存了照片并且没有崩溃,这是两次。

成功后,我再次尝试,得到了这个:

09-09 17:19:22.381 6163-6163/com.android.camera E/Camera: Error 100 09-09 17:19:22.381 6163-6163/com.android.camera E/CameraErrorCallback: Got >camera error callback. error=100 09-09 17:19:22.381 6163-6163/com.android.camera E/AndroidRuntime: FATAL >EXCEPTION: main Process: >com.android.camera, PID: 6163

java.lang.RuntimeException: Media server died. at >com.android.camera.CameraErrorCallback.onError(CameraErrorCallback.java:31) at >android.hardware.Camera$EventHandler.handleMessage(Camera.java:1148) at >android.os.Handler.dispatchMessage(Handler.java:102) at >android.os.Looper.loop(Looper.java:135) at >android.app.ActivityThread.main(ActivityThread.java:5254) at >java.lang.reflect.Method.invoke(Native Method) at >java.lang.reflect.Method.invoke(Method.java:372) at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at >com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

稍后尝试后,我又遇到了一个不同的错误..

09-09 17:32:22.185 1530-1611/system_process E/AudioService: Media server died. 09-09 17:32:22.191 4072-4072/com.android.camera E/AndroidRuntime: FATAL >EXCEPTION: main Process: >com.android.camera, PID: 4072

java.lang.RuntimeException: getParameters failed (empty parameters) at >android.hardware.Camera.native_getParameters(Native Method) at >android.hardware.Camera.getParameters(Camera.java:1888) at >com.android.camera.Camera.initializeZoom(Camera.java:489) at >com.android.camera.Camera.initializeFirstTime(Camera.java:392) at >com.android.camera.Camera.access$600(Camera.java:87) at >com.android.camera.Camera$MainHandler.handleMessage(Camera.java:290) at >android.os.Handler.dispatchMessage(Handler.java:102) at >android.os.Looper.loop(Looper.java:135) at >android.app.ActivityThread.main(ActivityThread.java:5254) at >java.lang.reflect.Method.invoke(Native Method) at >java.lang.reflect.Method.invoke(Method.java:372) at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at >com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

这是我围绕调用相机功能/Activity 的代码:

设置相机图标onclick监听器:

public boolean onCreateOptionsMenu(Menu menu) {

        item.getActionView().setOnClickListener(new View.OnClickListener() >
            @Override
            public void onClick(View v) {
                startActivityForResult(CameraUtility.dispatchTakePictureIntent(getApplicationContext(), mushroomFolder), 1);
                return;
            }
        });
  return super.onCreateOptionsMenu(menu);
}

结果的 on activity 只是将最后拍摄的照片添加到图库中,甚至还没有达到,所以我不会费心包括它。

下面是我的 CameraUtility 的代码:

class CameraUtility extends AppCompatActivity {
private static String CURRENT_PHOTO_PATH;
public static String PHOTO_DIRECTORY;

public static void setPhotoDirectory(Context c) {
    PHOTO_DIRECTORY = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/";
}

public static Intent dispatchTakePictureIntent(Context c, String name) {
    String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HHmmss").format(new Date());
    String path = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/" + name + "/" + name + timeStamp + ".jpg";
    File file = new File(path);
    Uri outputFileUri;
    if (Build.VERSION.SDK_INT >= 23)           
        outputFileUri=FileProvider.getUriForFile(c,
        "com.tracker.mushroom.fileprovider", file);
    else
        outputFileUri = Uri.fromFile(file);
    CURRENT_PHOTO_PATH = file.getPath();
    Intent intent = new Intent(
            MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    return intent;
}

public static String getCurrentPhotoPath() {
    return CURRENT_PHOTO_PATH;
}

public static File[] getImageFiles(Context c, String mushroomFolder) throws IOException {
    String filePath = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/" + mushroomFolder;
    File file = new File(filePath);
    file.mkdirs();
    file.setReadable(true);
    file.setWritable(true);
    return file.listFiles();
    }
}

所以我不太确定这是我的代码问题,还是模拟器问题,或者是其他我什至不知道的问题,因为如果所有其他 API 都正常工作,我只能抓挠我的头。我知道 getParameters() 错误与 Camera 类有关,但我什至没有使用它,所以我不确定为什么它会触发该错误。欢迎并非常感谢所有和任何意见。

最佳答案

好吧,我做了一些进一步的测试,我认为我正处于将此归咎于模拟器/android studio 的地步。我在 api 22 和不同的手机型号上运行了 3 个 firebase robo 测试。

其中每一个都不断地打开和关闭相机 Activity ,但不幸的是,测试从未真正拍过照片,但崩溃发生在这之前。

如果我可以在具有 API 22 的物理设备上自行测试它,并且它可以工作,我肯定知道它是一个模拟器/android 问题。在这一点上,我什至觉得不值得花时间来尝试和调试它,尤其是在机器人测试之后。希望有人发现这很有用,并节省一些时间来追逐一些变异的幽灵错误,哈哈。

编辑: 想作为最后的说明添加。我下载了 api 22 x86,安装了它并制作了一个新的模拟器。没有更多的问题。我使用的是 api 22 x86_64,出于某种原因它不喜欢在该版本上工作。为那些发表评论的人干杯,你们非常棒。

关于java - API 22 相机按 Intent 发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136450/

相关文章:

Android TTS 提供的语言比设置中提供的语言多

java - createNewFile - 打开失败 : ENOENT (No such file or directory)

java - 我想在 Android 中的 SeekBar OnProgres 更改事件上设置图像的亮度?

java - 文件解析和翻译的单元测试

Java 实例化新的 Map.Entry-array

java - GAE fetchAsync 是否会比请求的生命周期更长?

java - Eclipse 内容辅助错误

android - 如何在android中单击按钮从前到后和从后到前更改相机

android - EK-GC200 上的硬件相机快门/拍摄按钮三星 Galaxy 相机

javascript - 获取 Threejs 场景和相机方向以设置默认 View