(备忘)UE5.1获取Android设备信息

通过看模板代码文件:GameActivity.java.template

(路径:\Engine\Build\Android\Java\src\com\epicgames\unreal\GameActivity.java.template)

或者已构建过安卓包的,可直接看GameActivity.java

(项目名\Intermediate\Android\arm64\gradle\app\src\main\java\com\epicgames\unreal\GameActivity.java)

方法1:

OnCreate函数里有调用processSystemInfo函数;

@Override
public void onCreate(Bundle savedInstanceState)
{        
..........................

//$${gameActivityBeforeConfigRulesAppliedAdditions}$$

		// run configuration rules
		if (!processSystemInfo(ProjectName, appPackageName))
		{
			// configuration failed (show error)
			return;
		}
...........................

}

而processSystemInfo函数里有通过nativeSetConfigRulesVariables函数传递设备信息到C++层

		
private boolean processSystemInfo(String ProjectName, String PackageName)
{
......................................
        Map<String, String> variables = new HashMap<String, String>();

		ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
		ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
		activityManager.getMemoryInfo(memoryInfo);

		int totalMemory = (int)(memoryInfo.totalMem / 1024 / 1024);
		Log.debug("Memory: " + totalMemory + " MB");
		variables.put("memory", Integer.toString(totalMemory));

		//variables.put("Profile", "Android");
		variables.put("versionCode", Integer.toString(VersionCode));
		variables.put("versionName", VersionName);
		variables.put("targetSdkVersion", Integer.toString(targetSdkVersion));
		variables.put("unsupportedDevice", "false");
		variables.put("OverrideProfile", "true");
		variables.put("hardware", hardware);
		variables.put("ro.hardware", roHardware);
		variables.put("ro.soc.model", roSOCModel);
		variables.put("processor", processor);
		variables.put("processorCount", Integer.toString(processorCount));
		variables.put("useAffinity", "false");
		variables.put("hasNEON", bHasNEON ? "true" : "false");
		variables.put("isARM64", bIsARM64 ? "true" : "false");
		variables.put("littleCoreMask", "0x0");
		variables.put("bigCoreMask", "0xffff");

		variables.put("SRC_GpuFamily", OpenGLDevice);
		variables.put("SRC_GlVersion", OpenGLDriver);
		variables.put("SRC_AndroidVersion", android.os.Build.VERSION.RELEASE);
		variables.put("SRC_DeviceMake", android.os.Build.MANUFACTURER);
		variables.put("SRC_DeviceModel", android.os.Build.MODEL);
		variables.put("SRC_DeviceBuildNumber", android.os.Build.DISPLAY);
		variables.put("SRC_VulkanVersion", VulkanVersionString);
		variables.put("SRC_VulkanAvailable", (bSupportsVulkan && VulkanVersionString != "0.0.0") ? "true" : "false");  // commandline could still disable!
		variables.put("SRC_UsingHoudini", bHasHoudini ? "true" : "false");
		variables.put("SRC_HMDSystemName", "");

		variables.put("SRC_GpuVendor", OpenGLVendor);
		variables.put("SRC_SDKLevel", Integer.toString(android.os.Build.VERSION.SDK_INT));
		variables.put("supportsFloatingPointRenderTargets", bSupportsFloatingPointRenderTargets ? "true" : "false");
		variables.put("TextureFormats", TextureFormats);


.................

        nativeSetConfigRulesVariables(keyValues);

//$${gameActivityPostConfigRulesAdditions}$$
//$${gameActivityFinalizeConfigRulesAdditions}$$

		return !bForceGameEndWithError;
}

同时可以看引擎源码里,
在C++层的AndroidPlatformMisc.cpp文件可见(UnrealEngine\Engine\Source\Runtime\Core\Private\Android\AndroidPlatformMisc.cpp)

传递过来的所有键值对都存在FAndroidMisc::ConfigRulesVariables里。

JNI_METHOD void Java_com_epicgames_unreal_GameActivity_nativeSetConfigRulesVariables(JNIEnv* jenv, jobject thiz, jobjectArray KeyValuePairs)
{
	int32 Count = jenv->GetArrayLength(KeyValuePairs);
	int32 Index = 0;
	while (Index < Count)
	{
		auto javaKey = FJavaHelper::FStringFromLocalRef(jenv, (jstring)(jenv->GetObjectArrayElement(KeyValuePairs, Index++)));
		auto javaValue = FJavaHelper::FStringFromLocalRef(jenv, (jstring)(jenv->GetObjectArrayElement(KeyValuePairs, Index++)));
		
		FAndroidMisc::ConfigRulesVariables.Add(javaKey, javaValue);
	}
}

所以我们可以通过GetConfigRulesVariable,传目标key值,即可获取对应的设备信息。

FString* FAndroidMisc::GetConfigRulesVariable(const FString& Key)
{
	return ConfigRulesVariables.Find(Key);
}

方法2:只局限部分参数

还是在GameActivity的OnCreate函数里找到:

@Override
public void onCreate(Bundle savedInstanceState)
{

....................
    nativeSetAndroidVersionInformation( android.os.Build.VERSION.RELEASE, targetSdkVersion, android.os.Build.MANUFACTURER, android.os.Build.MODEL, android.os.Build.DISPLAY, Language );

.................
}

同时看引擎源码

LaunchAndroid.cpp

(UnrealEngine\Engine\Source\Runtime\Launch\Private\Android\LaunchAndroid.cpp)

JNI_METHOD void Java_com_epicgames_unreal_GameActivity_nativeSetAndroidVersionInformation(JNIEnv* jenv, jobject thiz, jstring androidVersion, jint targetSDKversion, jstring phoneMake, jstring phoneModel, jstring phoneBuildNumber, jstring osLanguage)
{
	auto UEAndroidVersion = FJavaHelper::FStringFromParam(jenv, androidVersion);
	auto UEPhoneMake = FJavaHelper::FStringFromParam(jenv, phoneMake);
	auto UEPhoneModel = FJavaHelper::FStringFromParam(jenv, phoneModel);
	auto UEPhoneBuildNumber = FJavaHelper::FStringFromParam(jenv, phoneBuildNumber);
	auto UEOSLanguage = FJavaHelper::FStringFromParam(jenv, osLanguage);

	FAndroidMisc::SetVersionInfo(UEAndroidVersion, targetSDKversion, UEPhoneMake, UEPhoneModel, UEPhoneBuildNumber, UEOSLanguage);
}

AndroidPlatformMisc.cpp文件(UnrealEngine\Engine\Source\Runtime\Core\Private\Android\AndroidPlatformMisc.cpp)

void FAndroidMisc::SetVersionInfo( FString InAndroidVersion, int32 InTargetSDKVersion, FString InDeviceMake, FString InDeviceModel, FString InDeviceBuildNumber, FString InOSLanguage )
{
	AndroidVersion = InAndroidVersion;
	AndroidMajorVersion = FCString::Atoi(*InAndroidVersion);
	TargetSDKVersion = InTargetSDKVersion;
	DeviceMake = InDeviceMake;
	DeviceModel = InDeviceModel;
	DeviceBuildNumber = InDeviceBuildNumber;
	OSLanguage = InOSLanguage;

	UE_LOG(LogAndroid, Display, TEXT("Android Version Make Model BuildNumber Language: %s %s %s %s %s"), *AndroidVersion, *DeviceMake, *DeviceModel, *DeviceBuildNumber, *OSLanguage);
}

.................................................

const FString FAndroidMisc::GetDeviceModel()
{
	return DeviceModel;
}

PS:实际使用比如

FString* andModel = FAndroidMisc::GetConfigRulesVariable(TEXT("SRC_DeviceModel"));//获取model方法1

FString andModel2 = FAndroidMisc::GetDeviceModel();//获取model方法2

std::string jsonInfo("{\"Model\":\"");
jsonInfo.append(TCHAR_TO_UTF8(**andModel));
//jsonInfo.append(TCHAR_TO_UTF8(*andModel2));
jsonInfo.append("\"}");

UE_LOG(LogTemp, Display, TEXT("Android:: %s"),UTF8_TO_TCHAR(jsonInfo.c_str()));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值