【问题标题】:I am using android camera,if i click the camera button it will opens,but after taken the picture ,my application has stopped? [closed]我使用的是安卓相机,如果我点击相机按钮,它会打开,但拍照后,我的应用程序停止了? [关闭]
【发布时间】:2024-05-03 06:15:02
【问题描述】:
 public void startCamera() {
  Log.d("TDM_CAMERA", "Starting camera on the phone...");
  String fileName = "testphoto.jpg";
  ContentValues values = new ContentValues();
  values.put(MediaStore.Images.Media.TITLE, fileName);
  values.put(MediaStore.Images.Media.DESCRIPTION,
          "Image capture by camera");
  values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
  imageUri = getContentResolver().insert(
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  startActivityForResult(intent, 1337);
}

log cat 显示 imageUri = getContentResolver().this line 中的错误

02-08 07:32:11.505: E/AndroidRuntime(2136): FATAL EXCEPTION: main
02-08 07:32:11.505: E/AndroidRuntime(2136): java.lang.UnsupportedOperationException: Unknown URI: content://media/external/images/media
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:169)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.content.ContentResolver.insert(ContentResolver.java:866)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at com.Ibetter.tdm.ReqEditActivity.startCamera(ReqEditActivity.java:597)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at com.Ibetter.tdm.ReqEditActivity$4.onClick(ReqEditActivity.java:107)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.view.View.performClick(View.java:4202)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.view.View$PerformClick.run(View.java:17340)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.os.Handler.handleCallback(Handler.java:725)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.os.Looper.loop(Looper.java:137)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at android.app.ActivityThread.main(ActivityThread.java:5039)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at java.lang.reflect.Method.invokeNative(Native Method)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at java.lang.reflect.Method.invoke(Method.java:511)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-08 07:32:11.505: E/AndroidRuntime(2136):     at dalvik.system.NativeStart.main(Native Method)
02-08 07:32:13.935: I/Process(2136): Sending signal. PID: 2136 SIG: 9
02-08 07:32:14.835: E/Trace(2175): error opening trace file: No such file or directory (2)
02-08 07:32:14.835: W/Trace(2175): Unexpected value from nativeGetEnabledTags: 0

【问题讨论】:

  • @PaNaVTEC.i 没有得到您的答案,日志显示该行中的错误 imageUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  • 您是否将清单设置为访问 SD 卡?
  • @dinesh707.你能告诉我如何访问 SD 卡吗?
  • 这是我的 mainfest.xml\
  • 我没有得到答案

标签: java android eclipse oop


【解决方案1】:

您设置输出文件的方式很可疑。

试试这样:

public void startCamera() throws IOException {
  Log.d("TDM_CAMERA", "Starting camera on the phone...");
  File photosDir = new File(Environment.getExternalStorageDirectory(), "photos");
  if (!photosDir.isDirectory()) {
      photosDir.mkdirs();
  }
  File imageFile = File.createTempFile("testphoto", ".jpg", photosDir);
  Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  startActivityForResult(intent, 1337);
}

还要确保在您的 Android 清单中声明了使用外部存储:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

有关详细信息,请参阅文档中的此页面: http://developer.android.com/training/camera/photobasics.html

【讨论】:

  • @janos-我也使用了你的代码,但是在捕获图像后我的应用程序已经停止,我之前提到的 logcat 中显示的问题
  • pastebin.com/ji858fNR 这个链接有一个完整的@janos
  • 好的,现在问题出在我们传递给Uri.fromFile的URL上。请按照我在答案中写的方式尝试,使用Environment.getExternalStorageDirectory() 而不是我之前建议的Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
  • 我已经更改了答案中的代码。如果您使用更改后的代码更新程序,那么您的程序将正常工作,或者 logcat 中的错误消息将有所不同。请尝试一下,如果仍然有问题,请将新的错误消息粘贴到 logcat 上。
  • 它工作正常,谢谢,它只保存在 SD 卡中吗?以及如何在活动页面上显示该图像
【解决方案2】:

我和你打赌forgot to insert the SD card

编辑: 您可以在活动中使用此代码访问它:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.capture);

    Button capture = (Button) findViewById(R.id.capture_button);
    capture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // We use the stock camera app to take a photo
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
            startActivityForResult(intent, TAKE_PHOTO_CODE);
        }
    });
}

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

    if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
        Uri imagePath = getImageUri();

        doSomething();
    }
}

/**
 * Get the uri of the captured file
 * @return A Uri which path is the path of an image file, stored on the dcim folder
 */
private Uri getImageUri() {
    // Store image in dcim
    File file = new File(Environment.getExternalStorageDirectory() + "/DCIM", CAPTURE_TITLE);
    Uri imgUri = Uri.fromFile(file);

    return imgUri;
}

【讨论】:

  • 如何在代码中将图像保存在 SD 卡中。请告诉我该怎么做?
  • ,我还有一个疑问,这是否可以在拍照后显示在同一页面中,并且必须显示在该页面中。如何?
  • 是的,使用这个代码:*.com/a/5991757/1484779
  • 我想用你的代码和那个代码一起使用吗?两者是不同的,他们没有像getImageUri()这样的调用函数。我该怎么写?
  • 我想用那个代码添加你的代码或者我想单独使用那个代码是可以的
最近更新 更多