如何在Android LolliPpop中使用相机应用程序

时间:2015-09-09 12:53:10

标签: android camera android-5.0-lollipop android-camera-intent

我在我的应用中多次使用Android原生相机应用。但它是在Lollipop发布之前。现在我正在使用相机并让我的应用程序崩溃。

似乎我在两种情况下都将意图数据设为null或有时空了我的崩溃。我在谈论以下一段代码

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

        if (resultCode == RESULT_OK) {

            switch (requestCode) { .....

这里的意图总是空的一些网站和问题,建议在调用相机应用程序时停止使用以下代码行;

  

intent.putExtra(MediaStore.EXTRA_OUTPUT,xyz);

所以使用MediaStore.EXTRA_OUTPUT不会返回数据意图。因此,在删除此行后,我能够找到非空和空的意图

但是,当意图类型和路径发生变化时,应用程序仍在崩溃。我现在不明白如何从onActivityResult的意图中提取图片的uri。有人说现在在android 5.0中,相机图像也被视为文件。但我不确定。

在官方开发者网站上我看到他们说要使用Corp功能但是我不知道如何使用它。所以最后我很少提及。

有人可以告诉我,在Android 5.0 Lollipop中从相机保存到图库后,我应该实现什么来获取图像?

基于CommansWare的答案

我已经用我的代码实现了你的代码的一部分并且它开始工作但它只在相机是肖像但是处于陆地scap模式时才在棒棒糖中工作我的应用程序崩溃了,这里是堆栈跟踪,运行时异常< / p>

  

java.lang.RuntimeException:无法恢复活动{com.example.myapp / com.example.mapp.MyCameraActivity}:java.lang.RuntimeException:传递结果失败ResultInfo {who = null,request = 2,result = -1,data = null}到activity {com.example.myapp / com.example.myapp.MyCameraActivity}:java.lang.NullPointerException:file               在android.app.ActivityThread.performResumeActivity(ActivityThread.java:3394)

现在我并不认为当相机处于横向模式时它会崩溃的原因。

  

请建议我一个完整的源代码或至少旁边的部分   onActivityResult

已修改

这里是如何点击按钮我打开相机

File output;
    public void onLargeImageCapture(View v) {

        mHighQualityImageUri = generateTimeStampPhotoFileUri();
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            File dir=
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

        output=new File(dir, System.currentTimeMillis()
                + ".jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));

        startActivityForResult(intent, REQUEST_CODE_HIGH_QUALITY_IMAGE);


    }

 private Uri generateTimeStampPhotoFileUri() {

        Uri photoFileUri = null;
        File outputDir=
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
//        File outputDir = getPhotoDirectory();
        if (outputDir != null) {
            Time t = new Time();
            t.setToNow();
            File photoFile = new File(outputDir, System.currentTimeMillis()
                    + ".jpg");
            photoFileUri = Uri.fromFile(photoFile);
        }
        return photoFileUri;
    }

以下是我为Android版套件kat和棒棒糖实现的部分

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

        if (resultCode == RESULT_OK) {

            switch (requestCode) {

                case REQUEST_CODE_HIGH_QUALITY_IMAGE:

                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        Intent mediaScanIntent = new Intent(
                                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                        Uri contentUri =Uri.fromFile(output) ; //out is your output file
                        mediaScanIntent.setData(contentUri);
                        this.sendBroadcast(mediaScanIntent);
                      //  sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mHighQualityImageUri));

                        //refreshing gallery
                        Intent mediaScanIntentKitKat = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                        mediaScanIntentKitKat.setData(Uri.fromFile(output));
                        sendBroadcast( mediaScanIntentKitKat);

                        Intent intentActivityKitKat = new Intent(MyCameraActivity.this, PhotoSortrActivity.class);
                        intentActivityKitKat.putExtra("data", Uri.fromFile(output));
                        Log.v("Uri before Sending", mHighQualityImageUri + "");
                        startActivity(intentActivityKitKat);
                    } else {
                        sendBroadcast(new Intent(
                                Intent.ACTION_MEDIA_MOUNTED,
                                Uri.parse("file://"
                                        + Environment.getExternalStorageDirectory())));

1 个答案:

答案 0 :(得分:1)

  

似乎我在两种情况下都将意图数据设为null或有时空?

如果“意图数据为空”,则表示您没有通过Uri中的Intent向您传递onActivityResult(),这是正确的。如果您阅读the documentation for ACTION_IMAGE_CAPTURE,则其中没有任何内容表明相机应用必须返回指向任何内容的Uri

使用MediaStore.EXTRA_OUTPUT记住您​​提供的值。然后,使用它来尝试访问图像:

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();
      }
    }
  }
}

有些相机应用已足够破坏,即使这样也行不通:

  • 他们可能不会真正尊重ACTION_IMAGE_CAPTURE,尽管有<intent-filter>

  • 他们可能会忽略EXTRA_OUTPUT并将照片写在他们想要的地方

大多数相机应用程序表现良好,但不是全部。 ACTION_IMAGE_CAPTURE仅适用于您可以在没有拍照的情况下生活,或者您愿意告诉用户他们的相机应用程序看起来写得不好并且应该切换到其他内容的情况。