0


Unity2017在安卓下获取GPS位置时闪退的解决办法

在Unity使用低功耗蓝牙通信(BLE)需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。

解决办法:调用原生安卓接口。

参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin,在插件中提供获取GPS位置的接口StartGPSLocation,插件代码如下

  1. package com.example.gpsplugin;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.location.Location;
  5. import android.location.LocationListener;
  6. import android.location.LocationManager;
  7. import android.os.Bundle;
  8. import android.widget.Toast;
  9. public class GPSPluginInstance {
  10. private LocationManager locationManager;
  11. private LocationListener locationListener;
  12. private static final int REQUEST_LOCATION_PERMISSION = 1;
  13. double latitude = 0.0;
  14. double longitude = 0.0;
  15. public int Add(int i, int j) {
  16. return i + j;
  17. }
  18. private static Activity unityActivity;
  19. public static void receiveUnityActivity(Activity tActivity) {
  20. unityActivity = tActivity;
  21. }
  22. public void Toast(String msg) {
  23. Toast.makeText(unityActivity, msg, Toast.LENGTH_SHORT).show();
  24. }
  25. public void StartGPSLocation() {
  26. // 初始化 LocationManager
  27. locationManager = (LocationManager) unityActivity.getSystemService(Context.LOCATION_SERVICE);
  28. // 创建 LocationListener
  29. if(locationListener == null)
  30. {
  31. locationListener = new LocationListener() {
  32. @Override
  33. public void onLocationChanged(Location location) {
  34. if (location != null) {
  35. latitude = location.getLatitude();
  36. longitude = location.getLongitude();
  37. }
  38. }
  39. @Override
  40. public void onStatusChanged(String provider, int status, Bundle extras) {
  41. // 状态改变时调用
  42. }
  43. @Override
  44. public void onProviderEnabled(String provider) {
  45. // 提供者启用时调用
  46. }
  47. @Override
  48. public void onProviderDisabled(String provider) {
  49. // 提供者禁用时调用
  50. }
  51. };
  52. }
  53. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);
  54. }
  55. }

AndroidManifest.xml中添加蓝牙和位置权限(注意Android12以上和之前的版本不一样)

  1. <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
  2. <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  3. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  4. <uses-permission android:name="android.permission.BLUETOOTH"/>
  5. <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
  6. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  7. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Unity代码,在使用Input.location.Start()的地方替换成StartGPSLocation就行了

  1. public class BLEBluetoothGunMgr : MonoBehaviour
  2. {
  3. void Start()
  4. {
  5. InitializePlugin("com.example.gpsplugin.GPSPluginInstance");
  6. }
  7. public void GetPos()
  8. {
  9. //Input.location.Start()
  10. StartGPSLocation();
  11. }
  12. void InitializePlugin(string pluginName)
  13. {
  14. unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  15. unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
  16. _pluginInstance = new AndroidJavaObject(pluginName);
  17. if (_pluginInstance == null)
  18. {
  19. Debug.Log("Plugin Instance Error");
  20. }
  21. _pluginInstance.CallStatic("receiveUnityActivity", unityActivity);
  22. }
  23. public void Toast()
  24. {
  25. if (_pluginInstance != null)
  26. {
  27. _pluginInstance.Call("Toast", "Hi,from Unity");
  28. }
  29. }
  30. public void StartGPSLocation()
  31. {
  32. if (_pluginInstance != null)
  33. {
  34. _pluginInstance.Call("StartGPSLocation");
  35. }
  36. }
  37. }
标签: unity Android GPS

本文转载自: https://blog.csdn.net/zouxin_88/article/details/142639664
版权归原作者 程序员正茂 所有, 如有侵权,请联系我们删除。

“Unity2017在安卓下获取GPS位置时闪退的解决办法”的评论:

还没有评论