- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我通过 startActivityForResult
使用 android.provider.MediaStore.ACTION_IMAGE_CAPTURE
和 android.provider.MediaStore.EXTRA_OUTPUT
调用我的相机想要在我的 onActivityResult
但是当我在拍完照片后点击复选标记的那一刻,当它应该被送回的那一刻,我收到一条错误消息,大致翻译为“相机错误 - 保存您的其中一张图像时出现问题或剪辑”- 我可以关闭对话框或向 Google 开发团队发送反馈。
此时的 Logcat 输出为:
09-01 22:01:46.157 24523-24523/com.google.android.GoogleCamera E/CAM_FatalErrorHandler﹕ Handling Media Storage Failure:
java.lang.Exception
at com.android.camera.FatalErrorHandlerImpl.onMediaStorageFailure(FatalErrorHandlerImpl.java:37)
at com.android.camera.PhotoModule.onError(PhotoModule.java:274)
at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1289)
at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593)
at android.view.View.performClick(View.java:4781)
at android.view.View$PerformClick.run(View.java:19873)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
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:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
09-01 22:01:46.158 24523-24523/com.google.android.GoogleCamera E/CAM_CameraUtil﹕ Show fatal error dialog
我的代码(清除了不相关的部分):
private File tmpFile;
private Uri tmpFileURI;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// TempFile needs to be created for the camera to store the fullsize captured image
// tmpFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + MainActivity.APP_BASE_FOLDER + "/tmp.jpg");
try
{
tmpFile = File.createTempFile("my_app", ".jpg");
} catch (IOException e)
{
e.printStackTrace();
}
tmpFileURI = Uri.fromFile(tmpFile);
chooseCamera.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
takePicture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tmpFileURI);
startActivityForResult(takePicture, CreateModifiyEventFragment.CHOOSE_BY_CAMERA);//zero can be replaced with any action code
}
});
chooseLibrary.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto, CreateModifiyEventFragment.CHOOSE_BY_LIBRARY);//one can be replaced with any action code
}
});
}
看到的常量是这样声明的:
public final static int CHOOSE_BY_CAMERA = 1;
public final static int CHOOSE_BY_LIBRARY = 0;
永远不会到达回调代码,所以我将为您节省更多代码。你可以看到我通过 tmpFile 和外部存储上的普通文件进行了尝试。
还设置了权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我不知道是什么触发了这个错误,也不知道我错过了什么。我使用其他 SO 答案来创建此代码,但没有发现任何差异。
如有任何帮助,我们将不胜感激。提前致谢!
最佳答案
File.createTempFile()
不太可能在 Android 上为您提供有用的东西。更重要的是,你无法知道第三方相机应用程序是否可以在那里写入。选择外部存储上的位置(例如,getExternalFilesDir()
或 Environment.getExternalStoragePublicDirectory()
):
package com.commonsware.android.camcon;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;
public class CameraContentDemoActivity extends Activity {
private static final int CONTENT_REQUEST=1337;
private File output=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File dir=
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
output=new File(dir, "CameraContentDemo.jpeg");
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));
startActivityForResult(i, CONTENT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == CONTENT_REQUEST) {
if (resultCode == RESULT_OK) {
Intent i=new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(output), "image/jpeg");
startActivity(i);
finish();
}
}
}
}
此外,您不需要 CAMERA
权限,因为您不是在拍照——您是在请求第三方应用拍照。
关于android - 带有 EXTRA_OUTPUT 的 ACTION_IMAGE_CAPTURE 创建已处理的 "Handling Media Storage Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32340208/
我有一个简单的 Android 应用程序,它尝试拍照并将其作为包含多部分数据的 HTTP POST 发送到服务器。问题是 Android 的 Intent 行为在某些手机上是不同的。当我运行时 Int
我的应用程序的一个功能包括相机。用户拍照,应用程序显示图像。 我使用 StartActivityForResult 启动一个 ACTION_IMAGE_CAPTURE Intent ,并使用 onAc
几天来我一直在寻找这个问题的解决方案,但我不知道该怎么做:( 我有一个使用 native 相机拍照的应用程序,但问题是,有时,只有在某些设备上,当我拍照并保存并返回时,我的应用程序才会重新启动。 它是
我们正在尝试使用原生相机应用让用户拍摄一张新照片。如果我们省略 EXTRA_OUTPUT extra 并返回小的位图图像,它就可以正常工作。但是,如果我们在启动前对 Intent 进行 putExtr
我正在使用标准相机 Intent 拍照: Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startAc
尝试在 Unity C# 中访问 Android native 相机组件,但无法正确移植 java 代码。我有另一个 intent call 用于共享,但我似乎无法让它工作。 这是我的代码: stat
我正在使用此代码打开相机 Intent : Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePicture.
这个问题在这里已经有了答案: Low picture/image quality when capture from camera (3 个答案) 关闭 3 年前。 我希望在 ImageView 中
我正在拍摄如下照片: activity.startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), BaseDef.REQU
我试图简单地从手机摄像头获取图像。令人惊讶的是,它返回旋转。我在互联网上搜索了修复方法,并找到了许多使用 ExifInterface 的解决方案,但它只是有时有效。它的方向似乎是随机错误的,因为我只是
我对这个描述有点困惑: The caller may pass an extra EXTRA_OUTPUT to control where this image will be written. I
我遇到了问题:ACTION_IMAGE_CAPTURE Intent 的行为取决于硬件制造商。 我认为,从插入照片库的相机中获取照片的最佳方式必须如下所示 Intent intent = new In
我正在使用以下代码告诉系统我要拍照: Intent intent = new Intent( android.provider.Medi
我想做的是创建一个新文件夹并将相机拍摄的图像保存在该文件夹中。我正在尝试使用以下代码 fragment 实现它: public class DocsAdd extends Activity {
我正在调用相机: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXT
我正在尝试接收通过 Mediastore.ACTION_IMAGE_CAPTURE Intent 拍摄的图像的 URI,但由于某种原因,默认相机应用程序 (Google+) 在它返回到我的 Activ
我想将额外的数据放入 Intent 相机,这看起来很简单...... 几天前它还可以工作,但是我对代码、avd 和目标版本做了很多更改,但现在它不工作了。 该项目现在的目标版本为 11。 事实上,我的
我正在使用 ACTION_IMAGE_CAPTURE 请求相机应用拍照。根据official doc如果我的应用使用相机功能但不需要它来正常运行,则应在 list 中保留以下内容
默认情况下,相机应用程序完成后我可以获得的图像将是矩形的。我想知道是否有可能让相机应用程序获得方形图像而无需裁剪原始矩形图像。 最佳答案 不,对不起。 首先,ACTION_IMAGE_CAPTURE
在 Android 上执行 ACTION_IMAGE_CATPURE Intent 的最可靠方法是什么?我尝试了多种在网上找到的方法,但没有一种方法适用于所有设备。我的测试设备是 Nexus 6 (A
我是一名优秀的程序员,十分优秀!