1.unity中定位Unity之GPS定位(高德解析)_unity gps定位-CSDN博客
代码需要稍微修改一下,先把脚本绑到一个button上试一试!
2.先去高德地图认证(app定位)
创建应用和 Key-Web服务 API | 高德地图API (amap.com)
3.代码大致如下所示:
using UnityEngine;
using System.Collections;
using LitJson;
using UnityEngine.Networking;
//using UnityTools;
using UnityEngine.Android;
namespace Location
{
public class LocationTest : MonoBehaviour
{
private string longitude;//经度
private string latitude;//纬度
void Start() => StartCoroutine(StartGPS());
IEnumerator StartGPS()
{
//Unity给我们提供的一个相关权限类 Permission,可以判断当前相关权限是否开启
if (Permission.HasUserAuthorizedPermission(Permission.FineLocation))
{
//如果没有开启就提示开启权限
Permission.RequestUserPermission(Permission.FineLocation);
}
Debug.LogError("开始获取GPS信息");
// 检查位置服务是否可用
if (!Input.location.isEnabledByUser)
{
Debug.Log("位置服务不可用");
yield break;
}
// 查询位置之前先开启位置服务
Debug.Log("启动位置服务");
Input.location.Start();
// 等待服务初始化
int maxWait = 20;
while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
{
Debug.Log(Input.location.status.ToString() + ">>>" + maxWait.ToString());
yield return new WaitForSeconds(1);
maxWait--;
}
// 服务初始化超时
if (maxWait < 1)
{
Debug.Log("服务初始化超时");
yield break;
}
// 连接失败
if (Input.location.status == LocationServiceStatus.Failed)
{
Debug.Log("无法确定设备位置");
yield break;
}
else
{
Debug.Log("Location: \n" +
"纬度:" + Input.location.lastData.latitude + " \n" +
"经度:" + Input.location.lastData.longitude + " \n" +
"海拔:" + Input.location.lastData.altitude + " \n" +
"水平精度:" + Input.location.lastData.horizontalAccuracy + " \n" +
"垂直精度:" + Input.location.lastData.verticalAccuracy + " \n" +
"时间戳:" + Input.location.lastData.timestamp);
longitude = Input.location.lastData.longitude.ToString();
latitude = Input.location.lastData.latitude.ToString();
StartCoroutine(GetRequest(
"http://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + longitude + "," + latitude));
}
// 停止服务,如果没必要继续更新位置,(为了省电
Input.location.Stop();
}
string key = ""; //去高德地图开发者申请
IEnumerator GetRequest(string uri)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
{
// Request and wait for the desired page.
yield return webRequest.SendWebRequest();
string[] pages = uri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
// Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
JsonData jd = JsonMapper.ToObject(webRequest.downloadHandler.text);
Debug.LogError("rn" + jd["regeocode"]["formatted_address"].ToString());
}
}
}
}
}
4.此时无论电脑,还是手机,都无法获得定位权限,在手机的应用权限中,甚至找不到应用!
Unity 在Unity端申请Android权限_unity android 权限-CSDN博客
具体的开启过程如下:权限是一劳永逸的,做做没坏处!
第一步:
第二步:在新建的Assets\Plugins\Android目录下 ,增加对应的权限!
所有的24个权限Android 中的危险权限详细整理_Android_脚本之家 (jb51.net)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
第三步:此时依旧无法申请,手机权限管理中找不到unity应用,同时发现unity是可以调用手机模拟器的,这下任务简单了太多太多。
第四步:在手机安装的时候确实有权限提示,但程序执行后感觉动态链接是失效的
第五步:根据AI的回答,继续进行尝试吧,浪费时间了
第六步:此时other settings中API的等级情况如下图所示:
有已知
大胆推测是最低版本设置过高!修改为:
改了以后还不行!
第七步:再加一个launcher manifest,加了也不行
第八步:实测手机中已经开启了gps功能,也就是不会显示22。
但是27行的会出问题!
把start放到上面以后,任务顺利完成