本例使用 UE4.16,实现打开 Android 自带的相机,尽可能用最少的代码来实现,易于理解。
在 Primary game module .Build.cs 里添加,其他模块里写也是一样的。
Module.Build.cs
if (Target.Platform == UnrealTargetPlatform.Android)
{
PrivateDependencyModuleNames.AddRange(new string[] { "Launch" });
AdditionalPropertiesForReceipt.Add(new ReceiptProperty("AndroidPlugin", ModuleDirectory + "/OpenCamera_UPL.xml"));
}新建一个None类,使用单例类或使用静态的 jmethodID 成员,我这里使用的是单例。
xxxx_JNI.h
#include "Core.h"
#include "Runtime/Launch/Public/Android/AndroidJNI.h"
#include "Runtime/ApplicationCore/Public/Android/AndroidApplication.h" // 注意这里在4.18有变动
#include <android_native_app_glue.h>
class FxxxxJNI
{
jmethodID Method_OpenCamera;
static FxxxxJNI * Instance;
FxxxxJNI();
~FxxxxJNI();
public:
static FxxxxJNI * Get()
{
if (Instance) return Instance;
else
{
Instance = new (std::nothrow) FxxxxJNI();
return Instance;
}
}
virtual bool OpenCamera();
};xxxx_JNI.cpp
FxxxxJNI * FxxxxJNI::Instance(nullptr);
FxxxxJNI::FxxxxJNI()
{
if (JNIEnv * Env = FAndroidApplication::GetJavaEnv())
{
Method_OpenCamera = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_OpenCamera", "()Z", false);
}
}
bool FxxxxJNI::OpenCamera()
{
if (JNIEnv * Env = FAndroidApplication::GetJavaEnv())
{
return FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, Method_OpenCamera);
}
return false;
} 在.Build.cs 所在目录创建 OpenCamera_UPL.xml 文件,在这里面写打开 Android 相机的功能,直接在 UE4 里写 Android 代码真的是一件很奇妙的事。
<init>
<log text="OpenCamera INIT"/>
</init>
<proguardAdditions>
<insert>
</insert>
</proguardAdditions>
<prebuildCopies>
<copyDir src="$S(PluginDir)/../../ThirdPartyLibraries/Android"dst="$S(BuildDir)" />
</prebuildCopies>
<gameActivityImportAdditions>
<insert>
import android.content.Intent;
</insert>
</gameActivityImportAdditions>
<androidManifestUpdates>
<addPermission android:name="android.permission.READ_PHONE_STATE" />
</androidManifestUpdates>
<gameActivityClassAdditions>
<insert>
//调用相机
public boolean AndroidThunkJava_OpenCamera()
{
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
return true;
}
{
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
return true;
}
</insert>
</gameActivityClassAdditions>
</root>
</gameActivityClassAdditions>
</root>
版权声明:本文为RhyGame原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。