2016-07-23 11 views
0

最新のUnity3Dバージョンを使用しています。 LocationService.isEnabledByUserを使用しているときは、GPSが有効か無効かを確認する必要があります。ただし、常にtrueを返します。 Android 4.2スマートフォンを使用しています。ロケーションサービスでは、有効でない場合でも常に有効と表示されます。

この問題の原因は何か、どうしたら解決できますか?

+0

私は今、どのバージョンのアンドロイドを使用していますか? – Lundira

+0

私は4.2を使用しています。問題ではありません。それはどのAndroidバージョンでも動作するはずです。私はバージョン6でそれを試していないが、それは動作するはずです。マニフェストには ''パーミッションが含まれていることを確認してください。 – Programmer

答えて

1

一部のデバイスでは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();を開いてロケーションサービスを有効にするには、プレーヤーに通知することができます。

+0

マニフェストの ''パーミッションに含める必要があります。そうしないとクラッシュします。 – Programmer

関連する問題