Unreal中打开手机相册

最近接到了一个需求, 需要提供一个功能, 让玩家可以在游戏中打开自己的相册, 并从中选择照片上传, 现阶段的需求就是需要实现打开相册->选取照片->加载到内存->显示在UI上的功能, 本篇内容是实现此需求的笔记.

Android平台:

目前Android平台的想法是, Unreal->Java层通过JNI调用:

参考: https://blog.csdn.net/wbin233/article/details/50954868#comments

添加权限:

<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE” />

调用系统相册:

1
2
3
4
private static final int CHOOSE_PHOTO=0;  
Intent intent = new Intent(“android.intent.action.GET_CONTENT”);
intent.setType(”image/*”);
startActivityForResult(intent, CHOOSE_PHOTO);

关于StartActivityForResult可以参考: https://developer.android.google.cn/guide/components/activities/activity-lifecycle

函数原型:

https://developer.android.google.cn/reference/android/app/Activity#onActivityResult(int,%20int,%20android.content.Intent)

1
2
3
4
5
6
public void startActivityForResult (Intent intent, 
int requestCode)

protected void onActivityResult (int requestCode,
int resultCode,
Intent data)

startactivityForResult之后, 结果通过OnActivityResult返回, 上面的参数requestCode需要设计一下.

貌似Intent中获得的数据(文件路径)还要自己写个解析函数得到文件储存地址

https://blog.csdn.net/zhanghao_Hulk/article/details/105389870

https://www.cnblogs.com/zhujiabin/p/6692025.html

上面的代码封装后通过JNI加入到GameActivity.java中, 使用

1
2
3
4
5
<gameActivityClassAdditions>
<insert>
// TODO
</insert>
</gameActivityClassAdditions>

通过这个方法可以在回调中拿到相关数据, 具体内容还需要进一步分析

直觉上可以把处理的函数也插入到GameActivity中:

1
<gameActivityOnActivityResultAdditions>	</gameActivityOnActivityResultAdditions>

然后在Java里调用C++函数?

也可以通过AndroidJNI.h中定义的回调来注册:

1
2
3
// In AndroidJNI.h
// Delegate that can be registered to that is called when an activity is finished
static FOnActivityResult OnActivityResultDelegate;

貌似直接可以放在C++里处理

全局搜索搜到了一个原生的处理方法, 可以参考一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//E:\UnrealEngine4.18\Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay\Source\Public\OnlineSubsystemGooglePlay.h
// 它里面定义了一个
/** Handle of registered delegate for onActivityResult */
FDelegateHandle OnActivityResultDelegateHandle;
// 用来处理该代理

//E:\UnrealEngine4.18\Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay\Source\Private\OnlineSubsystemGooglePlay.cpp中的处理函数:

bool FOnlineSubsystemGooglePlay::Init()
{
//...

OnActivityResultDelegateHandle = FJavaWrapper::OnActivityResultDelegate.AddRaw(this, &FOnlineSubsystemGooglePlay::OnActivityResult);

return true;
}

bool FOnlineSubsystemGooglePlay::Shutdown()
{
FJavaWrapper::OnActivityResultDelegate.Remove(OnActivityResultDelegateHandle);
//...
return true;
}

void FOnlineSubsystemGooglePlay::OnActivityResult(JNIEnv *env, jobject thiz, jobject activity, jint requestCode, jint resultCode, jobject data)
{
// Pass the result on to google play - otherwise, some callbacks for the turn based system do not get called.
AndroidSupport::OnActivityResult(env, activity, requestCode, resultCode, data);
}

可供参考并仔细阅读:

累了, 今天不写了