最新のUnity3Dバージョンを使用しています。 LocationService.isEnabledByUserを使用しているときは、GPSが有効か無効かを確認する必要があります。ただし、常にtrueを返します。 Android 4.2スマートフォンを使用しています。ロケーションサービスでは、有効でない場合でも常に有効と表示されます。
この問題の原因は何か、どうしたら解決できますか?
最新のUnity3Dバージョンを使用しています。 LocationService.isEnabledByUserを使用しているときは、GPSが有効か無効かを確認する必要があります。ただし、常にtrueを返します。 Android 4.2スマートフォンを使用しています。ロケーションサービスでは、有効でない場合でも常に有効と表示されます。
この問題の原因は何か、どうしたら解決できますか?
一部のデバイスではLocationService.isEnabledByUser
に問題があり、私はこれをアプリケーションで使用するとは信用できません。信頼できません。このためのJavaプラグインをビルドするだけです。私はずっと前に作ったものを分かち合うつもりです。
のJava:
がLocationService
というクラスを作成します。パッケージ名がcom.progammer.plugin
で、フルパッケージ名がcom.progammer.plugin.LocationService
であるとします。
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
public class LocationService {
private static Context mContext;
// Called From C# to get the Context Instance
public static void receiveContextInstance(Context tempContext) {
mContext = tempContext;
}
// http://stackoverflow.com/a/10311891/3785314
public static boolean isLocationServiceEnabled() {
LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
boolean network_enabled = false;
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
Log.e("CONTEXT", "Error: " + ex.getMessage());
}
try {
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
Log.e("CONTEXT", "Error: " + ex.getMessage());
}
return (gps_enabled && network_enabled);
}
public static boolean isGPSLocationServiceEnabled() {
LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
boolean gps_enabled = false;
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
Log.e("CONTEXT", "Error: " + ex.getMessage());
}
return gps_enabled;
}
public static boolean isNetworkLocationServiceEnabled() {
LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
boolean network_enabled = false;
try {
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
Log.e("CONTEXT", "Error: " + ex.getMessage());
}
return network_enabled;
}
// http://stackoverflow.com/a/32797750/3785314
@SuppressWarnings({ "deprecation" })
public static boolean isAirplaneModeOn() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
/* API 17 and above */
return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} else {
/* below */
return Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
}
// http://stackoverflow.com/a/7713511/3785314
public static void notifyUserToEnableLocationService() {
CharSequence searchStr = "Please enable Location Service";
Toast.makeText(mContext, searchStr, Toast.LENGTH_LONG).show();
Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
gpsOptionsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(gpsOptionsIntent);
}
}
C#の:
LocationServiceManager
というスクリプトを作成します。
using UnityEngine;
using System.Collections;
public class LocationServiceManager
{
AndroidJavaClass unityClass;
AndroidJavaObject unityActivity;
AndroidJavaObject unityContext;
AndroidJavaClass customClass;
public LocationServiceManager()
{
//Replace with your full package name
sendContextReference("com.progammer.plugin.LocationService");
}
public void sendContextReference(string packageName)
{
unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
customClass = new AndroidJavaClass(packageName);
customClass.CallStatic("receiveContextInstance", unityContext);
}
///////////////////////////////////MAIN FUNCTIONS/////////////////////////////////////
public bool isLocationServiceEnabled()
{
return customClass.CallStatic<bool>("isLocationServiceEnabled");
}
public bool isGPSLocationServiceEnabled()
{
return customClass.CallStatic<bool>("isGPSLocationServiceEnabled");
}
public bool isNetworkLocationServiceEnabled()
{
return customClass.CallStatic<bool>("isNetworkLocationServiceEnabled");
}
public bool isAirplaneModeOn()
{
return customClass.CallStatic<bool>("isAirplaneModeOn");
}
public void notifyUserToEnableLocationService()
{
customClass.CallStatic("notifyUserToEnableLocationService");
}
}
C#のでプラグインを使用するには:
のは、テストするために、簡単なテストスクリプトを作ってみましょう新しいプラグイン。これはAndroid搭載端末でのみ実行されるため、エディタでは動作しません。
public class TestScript : MonoBehaviour
{
public Text text;
LocationServiceManager lsm;
void Start()
{
lsm = new LocationServiceManager();
text.text = "Air Plane Mode: " + lsm.isAirplaneModeOn();
text.text += "\r\nLocation Service Enabled: " + lsm.isLocationServiceEnabled();
text.text += "\r\nGPS Location Service Enabled: " + lsm.isGPSLocationServiceEnabled();
text.text += "\r\nNetwork Location Service Enabled: " + lsm.isNetworkLocationServiceEnabled();
}
}
あなたも場所の設定lsm.notifyUserToEnableLocationService();
とを開いてロケーションサービスを有効にするには、プレーヤーに通知することができます。
マニフェストの '
私は今、どのバージョンのアンドロイドを使用していますか? – Lundira
私は4.2を使用しています。問題ではありません。それはどのAndroidバージョンでも動作するはずです。私はバージョン6でそれを試していないが、それは動作するはずです。マニフェストには ' 'パーミッションが含まれていることを確認してください。 –
Programmer