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

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

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

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

复制代码
package com.example.gpsplugin;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

public class GPSPluginInstance {
    private LocationManager locationManager;
    private LocationListener locationListener;
    private static final int REQUEST_LOCATION_PERMISSION = 1;

    double latitude = 0.0;
    double longitude = 0.0;

    public int Add(int i, int j) {
        return i + j;
    }

    private static Activity unityActivity;

    public static void receiveUnityActivity(Activity tActivity) {
        unityActivity = tActivity;
    }

    public void Toast(String msg) {
        Toast.makeText(unityActivity, msg, Toast.LENGTH_SHORT).show();
    }

    public void StartGPSLocation() {
        // 初始化 LocationManager
        locationManager = (LocationManager) unityActivity.getSystemService(Context.LOCATION_SERVICE);

        // 创建 LocationListener
        if(locationListener == null)
        {
            locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                    // 状态改变时调用
                }

                @Override
                public void onProviderEnabled(String provider) {
                    // 提供者启用时调用
                }

                @Override
                public void onProviderDisabled(String provider) {
                    // 提供者禁用时调用
                }
            };
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener);
    }
}

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

复制代码
  <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
  <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />  
	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

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

cs 复制代码
public class BLEBluetoothGunMgr : MonoBehaviour
{
    void Start()
    {
        InitializePlugin("com.example.gpsplugin.GPSPluginInstance");
    }

    public void GetPos()
    {   
        //Input.location.Start()
        StartGPSLocation();
    }

    void InitializePlugin(string pluginName)
    {
        unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        _pluginInstance = new AndroidJavaObject(pluginName);
        if (_pluginInstance == null)
        {
            Debug.Log("Plugin Instance Error");
        }
        _pluginInstance.CallStatic("receiveUnityActivity", unityActivity);
    }
    
    public void Toast()
    {
        if (_pluginInstance != null)
        {
            _pluginInstance.Call("Toast", "Hi,from Unity");
        }
    }

    public void StartGPSLocation()
    {
        if (_pluginInstance != null)
        {
            _pluginInstance.Call("StartGPSLocation");
        }
    }
}
相关推荐
22 分钟前
Unity与Excel表格交互热更方案
unity·游戏引擎·excel
daifgFuture2 小时前
Android 3D球形水平圆形旋转,旋转动态更换图片
android·3d
二流小码农3 小时前
鸿蒙开发:loading动画的几种实现方式
android·ios·harmonyos
爱吃西红柿!4 小时前
fastadmin fildList 动态下拉框默认选中
android·前端·javascript
悠哉清闲4 小时前
工厂模式与多态结合
android·java
大耳猫5 小时前
Android SharedFlow 详解
android·kotlin·sharedflow
火柴就是我6 小时前
升级 Android Studio 后报错 Error loading build artifacts from redirect.txt
android
androidwork7 小时前
掌握 MotionLayout:交互动画开发
android·kotlin·交互
奔跑吧 android7 小时前
【android bluetooth 协议分析 14】【HFP详解 1】【案例一: 手机侧显示来电,但车机侧没有显示来电: 讲解AT+CLCC命令】
android·hfp·aosp13·telecom·ag·hf·headsetclient
Chenyu_3108 小时前
09.MySQL内外连接
android·数据库·mysql