我正在开发一个 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/