| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Android;
- using System.Runtime.InteropServices;
- using AOT;
- public class GPSTool
- {
- #if UNITY_IPHONE
- static Action<string[]> callbackOut;
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate void ResultHandler(string resultString);
- [MonoPInvokeCallback(typeof(ResultHandler))]
- static void resultHandler(string parameter)
- {
- //Debug.Log("unity parameter:" + parameter);
- string[] components = parameter.Split(new char[] { '\t' }, 6);
- string address = components[5];
- string[] addressOut = address.Split(new char[] { '\t' }, 3);
- callbackOut?.Invoke(addressOut);
- // 停止获取位置信息
- LocationPluginInterface.StopUpdatingLocation();
- }
- #endif
- //GPS获取地址
- //成功返回:string[]{国,省,市} (数组中不允许有null)
- //失败返回:null
- public static void GetAddress(Action<string[]> callback)
- {
- #if UNITY_ANDROID
- Func<string[]> func = delegate ()
- {
- if (Application.isEditor) return null;
- using (var clsU3D = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
- using (var objCtx = clsU3D.GetStatic<AndroidJavaObject>("currentActivity"))
- using (var objGPSTool = new AndroidJavaClass("com.example.smartbowlib.GPSTool"))
- {
- string[] address = objGPSTool.CallStatic<string[]>("getAddress", objCtx);
- if (address != null)
- {
- foreach (var item in address)
- if (item == null) return null;
- }
- return address;
- }
- };
- List<string> permissions = new List<string>();
- permissions.Add(Permission.CoarseLocation);
- permissions.Add(Permission.FineLocation);
- for (int i = permissions.Count - 1; i >= 0; i--)
- {
- if (Permission.HasUserAuthorizedPermission(permissions[i])) permissions.RemoveAt(i);
- }
- if (permissions.Count > 0)
- {
- var requestCB = new PermissionCallbacks();
- int needPermissionCount = permissions.Count;
- requestCB.PermissionGranted += (s) =>
- {
- Debug.Log("用户同意" + s);
- needPermissionCount--;
- if (needPermissionCount == 0) callback.Invoke(func.Invoke());
- };
- requestCB.PermissionDenied += (s) =>
- {
- Debug.Log("用户拒绝" + s);
- };
- requestCB.PermissionDeniedAndDontAskAgain += (s) =>
- {
- Debug.Log("用户拒绝且要求不再询问" + s);
- };
- Permission.RequestUserPermissions(permissions.ToArray(), requestCB);
- }
- else
- {
- callback?.Invoke(func.Invoke());
- }
- #endif
- #if UNITY_IPHONE
- callbackOut = callback;
- ResultHandler handler = new ResultHandler(resultHandler);
- IntPtr fp = Marshal.GetFunctionPointerForDelegate(handler);
- LocationPluginInterface.StartUpdatingLocation(fp);
- #endif
- }
- }
|