今天在做附近频道发言的时候,需要打开定位服务,然后在定位服务打开之后,需要去请求位置信息。 1、判断定位服务有没有打开:
Input.location.isEnabledByUser;
2、如果没有打开的话,则调用安卓的原生代码:
public void OpenPermissionSettings(String permission, PermissionRequesetCallback callback)
{
gameActivity.m_callback = callback;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
gameActivity.requestPermissions(new String[]{permission}, 1);
}
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int i = 0; i < permissions.length; i++)
{
if (grantResults[i] != 0 && !ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]))
{
grantResults[i] = -2;
}
}
if(m_callback != null)
{
m_callback.OnRequestPermissionsResultCallback(permissions, grantResults);
m_callback = null;
}
}
3、我们想在回调的时候,去请求定位信息 错误点1:我们在回调中,输出:Input.location.isEnabledByUser的值,结果报错: 这个表明Input.location.isEnabledByUser,不能在子线程中调用,于是我就把这个代码去掉,之后,确实可以调用到我们sdk中的请求代码的函数了。 错误点2:sdk中的请求函数,也报错:
解决方法是:
private void RequestCallback(string[] permissions, int[] grantResults)
{
if (grantResults.Length > 0)
{
m_chatDoc.m_grantCode = grantResults[0];
XDebug.singleton.AddGreenLog("RequestCallback grantResults1:" + m_chatDoc.m_grantCode);
}
}
然后我们在主线的Update中监听这个变量,进行处理:
int m_grantCode = -1;
public override void Update(float fDeltaT)
{
base.Update(fDeltaT);
RequestLocationAfterGrant();
}
private void RequestLocationAfterGrant()
{
if (m_grantCode == 0)
{
XDebug.singleton.AddGreenLog("RequestLocationAfterGrant1");
RequesetNewLocation();
m_grantCode = -1;
}
else if (m_grantCode == -2)
{
XDebug.singleton.AddGreenLog("RequestLocationAfterGrant2");
CFUtility.ShowSystemTips(XStringDefineProxy.GetString("open_location_permission"));
m_grantCode = -1;
}
}
|