이것은 Unity와 Native Android를 연결하는 데 사용하는 UnityBridge의 코드입니다.
Unity와 Android 사이의 다리는 성공적입니다. Unity에서 openCamera 메서드를 호출하면 카메라 앱이 열리고 사진을 찍을 수 있습니다. 촬영 후 이미지는 내부 메모리의 Demo 폴더에 저장됩니다. 이 단계까지는 문제가 없지만 사진을 저장 한 후 앱 강제가 종료됩니다. 다음과 같이 cmd에서 로그를 얻었습니다. onActivityResult에서 얻은 Intent 데이터가 null이라고 생각합니다. 누군가이 오류를 해결하도록 도와주세요. 이미지를 저장소 카드의 데모 폴더에 저장하고 촬영 한 사진의 파일 이름을 포함한 전체 파일 경로를 문자열 변수로 가져와 다음 프로세스를 위해 전체 파일 경로를 다시 단일화 할 수 있도록해야합니다. 가능합니까?
Logcat
E / AndroidRuntime (1873) : 원인 : java.lang.RuntimeException : 결과 ResultInfo {who = null, request = 100, result = -1, data = null}을 활동 {com.tony.example / com.tony에 전달하지 못했습니다. .example.UnityBridge} : java.lang.NullPointerException E / AndroidRuntime (1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3205) E / AndroidRuntime (1873) : at android.app.ActivityThread.handleSendResult (ActivityThread) .java : 3248) E / AndroidRuntime (1873) : android.app.ActivityThread.access $ 1200 (ActivityThread.java:140) E / AndroidRuntime (1873) : android.app.ActivityThread $ H.handleMessage (ActivityThread.java : 1285) E / AndroidRuntime (1873) : android.os.Handler.dispatchMessage (Handler.java:99) E / AndroidRuntime (1873) : android.os.Looper.loop (Looper.java:137) E / AndroidRuntime ( 1873) : android.app.ActivityThread.main (ActivityThread.java :4921) E / AndroidRuntime (1873) : java.lang.reflect.Method.invokeNative (NativeMethod) E / AndroidRuntime (1873) : java.lang.reflect.Method.invoke (Method.java:511) E / AndroidRuntime ( 1873) : at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1027) E / AndroidRuntime (1873) : at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : at dalvik.system.NativeStart.main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : at com.tony.example.UnityBridge. onActivityResult (UnityBridge.java:154) E / AndroidRuntime (1873) : android.app.Activity.dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : android.app.ActivityThread.deliverResults (ActivityThread.java : 3201) E / AndroidRuntime (1873) : ... 11 morereflect.Method.invokeNative (NativeMethod) E / AndroidRuntime (1873) : at java.lang.reflect.Method.invoke (Method.java:511) E / AndroidRuntime (1873) : at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1027) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : dalvik.system.NativeStart에서. main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : at com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154) E / AndroidRuntime (1873) : at android.app.Activity.dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 morereflect.Method.invokeNative (NativeMethod) E / AndroidRuntime (1873) : at java.lang.reflect.Method.invoke (Method.java:511) E / AndroidRuntime (1873) : at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1027) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : dalvik.system.NativeStart에서. main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : at com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154) E / AndroidRuntime (1873) : at android.app.Activity.dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 morereflect.Method.invoke (Method.java:511) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1027) E / AndroidRuntime (1873) : com. android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : at dalvik.system.NativeStart.main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154)에서 E / AndroidRuntime (1873) : android.app.Activity.dispatchActivityResult (Activity.java:5390)에서 E / AndroidRuntime ( 1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 morereflect.Method.invoke (Method.java:511) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1027) E / AndroidRuntime (1873) : com. android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : at dalvik.system.NativeStart.main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154)에서 E / AndroidRuntime (1873) : android.app.Activity.dispatchActivityResult (Activity.java:5390)에서 E / AndroidRuntime ( 1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 more1027) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : dalvik.system.NativeStart.main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : at com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154) E / AndroidRuntime (1873) : at android.app.Activity. dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 more1027) E / AndroidRuntime (1873) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794) E / AndroidRuntime (1873) : dalvik.system.NativeStart.main (Native Method) E / AndroidRuntime (1873) : 원인 : java.lang.NullPointerException E / AndroidRuntime (1873) : at com.tony.example.UnityBridge.onActivityResult (UnityBridge.java:154) E / AndroidRuntime (1873) : at android.app.Activity. dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : at android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime (1873) : ... 11 more154) E / AndroidRuntime (1873) : android.app.Activity.dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime ( 1873) : ... 11 더154) E / AndroidRuntime (1873) : android.app.Activity.dispatchActivityResult (Activity.java:5390) E / AndroidRuntime (1873) : android.app.ActivityThread.deliverResults (ActivityThread.java:3201) E / AndroidRuntime ( 1873) : ... 11 더
암호
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
매개 변수는 null이되기 때문입니다.
data
no EXTRA_OUTPUT
가 설정된 경우 Intent 매개 변수에 반환됩니다 . 경로가 아니라 사진 자체가 포함됩니다.
NPE를 방지하려면이 알림을 사용하십시오 (데이터 매개 변수 없음). Toast.makeText(this.context, "Image saved", Toast.LENGTH_LONG).show();
편집하다:
이것을 사용하여 저장 디렉토리를 가져 오면 갤러리에서 검색 할 수있는 이미지 폴더에 저장됩니다.
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
저장 경로를 표시하려면 전역 String
변수를 사용하여 파일을 만들 때 파일 경로를 저장 한 다음 알림에 표시합니다.
의 opencamera()
방법 :
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
globalStringFilePath = fileUri .getAbsolutePath();
그러면 당신의 토스트는
Toast.makeText(this.context, "Image saved to:\n" + globalStringFilePath , Toast.LENGTH_LONG).show()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다