这是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();
}
}
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,因为数据是空的。 编辑