0

こんにちは私は、プッシュ通知を受信したときにその場所を取得し、サーバーを呼び出して、それに基づいて通知を表示したり飲み込んだりするアプリに取り組んでいます。

私が経験している問題は、場所が現金化され、クライアントに時間内に通知できないことです。これは不可欠です。onLocationChangedすぐにメッセージを決定する必要があるため、明らかに購読できません。

私はそれについて読んだことがありますが、提案の1つは、com.google.android.gms.location.LocationListenerキャッシュをリセットする必要があるとは思わない初期化することでしたが、Googleマップを有効にすると、更新された座標を取得するのに実際に役立つため、これは実際にキャッシュの問題であると思います.

現在、コードは次のようになっています (プロトタイプのみと判断しないでください)。

 private String getLocation() {
    // Get the location manager
    new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

        }
    };
    LocationManager locationManager = (LocationManager)
            getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, false);
    if (bestProvider != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return "-1.1329097,51.257538";
            }
        }
        Location location = locationManager.getLastKnownLocation(bestProvider);
        try {
            return location.getLatitude() + "," + location.getLongitude();
        } catch (NullPointerException e) {
            return "-1.1329097,51.257538";
        }
    }
    return "-1.1329097,51.257538";
}

 public void onMessageReceived(String from, Bundle data) {
    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);
    sendNotification = true;
    callEmergency();
}

public boolean callEmergency(){

    StringBuffer chaine = new StringBuffer("");
    try{
        InstanceID instanceID = InstanceID.getInstance(this);
        String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
        URL url = new URL("http://www.ears.uk.com/User/CheckForEmergency?token="+token+"&coordinates="+getLocation());
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        //  connection.setRequestProperty("User-Agent", "");
        connection.setRequestMethod("GET");
        //  connection.setDoInput(true);
        connection.connect();
        int code = connection.getResponseCode();
        InputStream inputStream = connection.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = rd.readLine()) != null) {
            chaine.append(line);
        }
        if(chaine.toString().equals("True")){
            sendNotification("Emergency Vehicle Approaching");
        }
    } catch (IOException e) {
        // writing exception to log
        e.printStackTrace();
    }

    return chaine.toString() == "True";
}

これを行うためのより適切な解決策はありますか?

4

1 に答える 1

1

Googleマップを開くなど、場所の変更をトリガーしなかった場合でも、場所の変更が最後に記録されたときの場所がまだ残っています。

可能な限り最新の場所を取得する必要がある場合は、その場所の時間を確認し、getTimeその場所の時間が制限内にある場合は、その場所を使用できます。その時間が 5 時間経過している場合、場所リスナーを開始し、最初の有効な場所を取得してからリスナーを停止する必要がある新しいポイントを取得する必要があります。その部分については、サービスを開始する必要があります。その場所を取得するのにかかる時間は誰にもわからないからです。

于 2016-03-15T20:45:01.690 に答える