当前位置: 首页 > 知识库问答 >
问题:

android手机相机应用拍照后onActivityResult出现空指针异常

储俊英
2023-03-14

这是UnityBridge的代码,我正在使用它在Unity和原生Android之间架桥。

Unity和android之间的桥梁是成功的。当我从Unity调用openCamera方法时,相机应用程序打开,我可以拍摄照片。拍照后,图像保存到内存中的Demo文件夹中。直到这一步没有问题,但保存照片后,应用程序的力量关闭。我从cmd获得的日志如下所示:我认为在onActivityResult中获得的意图数据为NULL。有人能帮我解决这个错误吗。我需要将图像保存到存储卡中的Demo文件夹中,并将完整的文件路径(包括拍摄照片的文件名)保存到一个字符串变量中,这样我就可以将完整的文件路径返回到unity进行下一个过程。有可能吗?

logcat

package com.tony.example;

import java.io.ByteArrayOutputStream;
import java.io.File;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;

import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;

public class UnityBridge extends UnityPlayerActivity
{    
static private int _myInt;
private static int RESULT_LOAD_IMAGE = 1;
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
public static final int MEDIA_TYPE_IMAGE = 1;
private Uri fileUri;
private Context context;
private static UnityBridge instance;
public Bitmap imgbitmap;
public String picturepath;

public UnityBridge() {
    this.instance = this;
}

public static UnityBridge instance() {
    if(instance == null) {
        instance = new UnityBridge();
    }
    return instance;
}

public void setContext(Context context) {
    this.context = context;
}

public void openCamera()
{
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(android.os.Environment.getExternalStorageDirectory(), "Demo");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("Demo", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else {
        return null;
    }

    return mediaFile;
}


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

    Log.d("Request Code: "+requestCode,"Result Code: "+resultCode);

    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this.context, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this.context, "Image Capture cancelled by the user", Toast.LENGTH_LONG).show();
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
            Toast.makeText(this.context,"Something unexpected happened, Please check your Camera",Toast.LENGTH_LONG).show();
        }
    }

}

public void showMessage(String message) {
    Toast.makeText(this.context, message, Toast.LENGTH_SHORT).show();
}
}

共有1个答案

郁灿
2023-03-14

NPE在此处:toast.maketext(This.context,“Image saved to:\n”+data.getData(),toast.length_long).show();

因为当您启动活动(相机)时,文件将与照片相连保存,而intent data参数将为空。

如果未设置extra_output,则data将在Intent参数中返回。它将包含照片本身,而不是路径。

若要避免NPE,请使用此toast(不带数据参数)toast.maketext(this.context,“image saved”,toast.length_long).show();

编辑:

使用这个来获取存储目录,这样它就会被保存到图像文件夹中,这将被图库发现

File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
globalStringFilePath = fileUri .getAbsolutePath();
Toast.makeText(this.context, "Image saved to:\n" + globalStringFilePath , Toast.LENGTH_LONG).show()
 类似资料:
  • 本文向大家介绍Android实现手机拍照功能,包括了Android实现手机拍照功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家讲解如何轻松实现Android手机拍照功能,分享给大家供大家参考。具体如下: 一、布局文件main.xml 二、MainActivity.java 三、添加权限 效果如下: 希望本文所述对大家学习Android软件编程有所帮助。

  • 我可以按下一个按钮,打开原生相机app,成功拍下一张照片。但当我查看手机上的照片库或原生应用程序时,照片并没有保存在那里。我对Android很陌生,所以很可能我的代码中遗漏了一些重要的东西。 问题: 1)这些图片保存在哪里? 2)我是否可以修改下面的代码,以保存到内部存储,所以所有的图片拍摄与我的应用程序是私人的,只能通过我的应用程序访问? 3)如果我想将这些图片连同一些文本/其他输入一起保存到一

  • 所以我遇到了一个问题,前面在我提问的问题中提到过:将图像(ACTION_image_CAPTURE)上载到Firebase存储 我对这个问题进行了更多的搜索,并应用了Android Studio文档:https://developer.android.com/training/camera/photobasics.html#TaskPhotoView 所以,在您阅读代码之前,我基本上想说一下需要什

  • 在我的应用程序中,当我通过以下方式调用相机意图时: 它不调用方法。 我的应用程序中的问题是,有时它调用这个方法,但在捕获照片后的一段时间,它再次来到照片捕获屏幕。

  • 本文向大家介绍android实现手机App实现拍照功能示例,包括了android实现手机App实现拍照功能示例的使用技巧和注意事项,需要的朋友参考一下 实现手机App实现拍照功能结果如下 第一步: activity_takephoto.xml布局用SurfaceView 第二步:TakephotoActivity类 第三步:在AndroidManifest.xml中加权限 以上就是本文的全部内容,

  • 在我从相机中拍摄了照片之后,在onActivityResult(int requestCode,int resultCode,Intent data)方法中调用。在本例中,我得到了一个NPE,因为数据是空的。 编辑