当前位置: 首页 > news >正文

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() {// 初始化 LocationManagerlocationManager = (LocationManager) unityActivity.getSystemService(Context.LOCATION_SERVICE);// 创建 LocationListenerif(locationListener == null){locationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {if (location != null) {latitude = location.getLatitude();longitude = location.getLongitude();}}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {// 状态改变时调用}@Overridepublic void onProviderEnabled(String provider) {// 提供者启用时调用}@Overridepublic 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就行了

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");}}
}

http://www.lryc.cn/news/452489.html

相关文章:

  • OpenGL ES 索引缓冲区(4)
  • 01:(寄存器开发)点亮一个LED灯
  • .Net 6.0 Windows平台如何判断当前电脑是否联网
  • 微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用
  • MacOS 终端执行安装 Brew
  • 【设计模式-解释模式】
  • 51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)
  • Emergency Stop (ES)
  • [C++][第三方库][gtest]详细讲解
  • 【Java数据结构】 链表
  • 前端——Ajax和jQuery
  • C++-vector模拟实现
  • Activity
  • 【力扣 | SQL题 | 每日四题】力扣1581, 1811, 1821, 1831
  • 洛谷【P1955 [NOI2015] 程序自动分析】
  • Swift并发笔记
  • React 组件命名规范
  • eNSP网络配置指南:IP设置、DNS、Telnet、DHCP与路由表管理
  • 初步认识产品经理
  • web前端面试中拍摄的真实js面试题(真图)
  • python 人工智能 机器学习 当损失函数的数值变成 `nan` 时,这通常意味着在模型训练过程中出现了数值不稳定性以及解决办法,数据分析
  • Kafka快速实战与基本原理详解
  • tftp传文件被服务器拒绝进入tftp: server error: (768) Access to staonline.pcap denied
  • express,生成用户登录后的 token
  • 银河麒麟桌面操作系统修改默认Shell为Bash
  • 卷积神经网络(Convolutional Neural Networks, CNN)
  • SpringBoot系列 启动流程
  • vgg19提取特征
  • Qt 中的 QChartView
  • cheese安卓版纯本地离线文字识别插件