2

こんにちは、場所を取得してサーバーに送信するためのAndroidアプリケーションを開発しましたが、正常に機能していますが、場所の更新が機能していません現在、場所を取得して30分に1回サーバーに送信する必要があるため、このプロセスを実行する必要があります9時間から17時間だけどうすればいいですか?助けてください..!

私のコード:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        {

            Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
            intent.putExtra("enabled", true);
            this.sendBroadcast(intent);

            String provider = Settings.Secure.getString(getContentResolver(),
                    Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            if (!provider.contains("gps")) { // if gps is disabled
                final Intent poke = new Intent();
                poke.setClassName("com.android.settings",
                        "com.android.settings.widget.SettingsAppWidgetProvider");
                poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
                poke.setData(Uri.parse("3"));
                this.sendBroadcast(poke);

                manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                String providerName = manager.getBestProvider(new Criteria(),
                        true);
                Location location = manager.getLastKnownLocation(providerName);

                if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

                    TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    GsmCellLocation loc = (GsmCellLocation) mTelephonyManager
                            .getCellLocation();
                    String networkOperator = mTelephonyManager
                            .getNetworkOperator();

                    Log.d("CID", Integer.toString(loc.getCid()));
                    Log.d("LAC", Integer.toString(loc.getLac()));
                    int mcc = Integer.parseInt(networkOperator.substring(0, 3));
                    int mnc = Integer.parseInt(networkOperator.substring(3));

                    TextView tv1 = (TextView) findViewById(R.id.locationResults);
                    if (loc != null) {
                        tv1.setText("Cell ID: " + loc.getCid() + " , "
                                + "Lac: " + loc.getLac() + "mcc : " + mcc
                                + "mnc : " + mnc);

                    }

                    // manager.requestLocationUpdates(providerName, 1000 * 60 *
                    // 2, 0,this);

                }

            }

            else {

                String providerName = manager.getBestProvider(new Criteria(),
                        true);
                Location location = manager.getLastKnownLocation(providerName);

                TextView tv = (TextView) findViewById(R.id.locationResults);
                if (location != null) {
                    tv.setText(location.getLatitude() + " latitude, "
                            + location.getLongitude() + " longitude");

                    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    telephonyManager.getDeviceId();
                    String imei = telephonyManager.getDeviceId();

                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "yyyyMMdd_HHmmss");
                    String cdt = sdf.format(new Date());

                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();

                    String lat = Double.toString(latitude);
                    String lon = Double.toString(longitude);

                    String locations = Double.toString(latitude) + ","
                            + Double.toString(longitude);


                    // manager.requestLocationUpdates(providerName, 1000 * 60 *
                    // 2, 0,this);

                }

                else {

                    TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    GsmCellLocation loc = (GsmCellLocation) mTelephonyManager
                            .getCellLocation();
                    String networkOperator = mTelephonyManager
                            .getNetworkOperator();

                    Log.d("CID", Integer.toString(loc.getCid()));
                    Log.d("LAC", Integer.toString(loc.getLac()));
                    int mcc = Integer.parseInt(networkOperator.substring(0, 3));
                    int mnc = Integer.parseInt(networkOperator.substring(3));

                    // TextView tv1 = (TextView)
                    // findViewById(R.id.locationResults);
                    if (loc != null) {
                        tv.setText("Cell ID: " + loc.getCid() + " , " + "Lac: "
                                + loc.getLac() + "mcc : " + mcc + "mnc : "
                                + mnc);

                    }

                }

                manager.requestLocationUpdates(providerName, 1000 * 60 * 10, 1,
                        this);
            }
        }
    }

    // Find the closest Bart Station
    public String findClosestBart(Location loc) {
        double lat = loc.getLatitude();
        double lon = loc.getLongitude();

        double curStatLat = 0;
        double curStatLon = 0;
        double shortestDistSoFar = Double.POSITIVE_INFINITY;
        double curDist;
        String curStat = null;
        String closestStat = null;

        // sort through all the stations
        // write some sort of for loop using the API.

        curDist = Math.sqrt(((lat - curStatLat) * (lat - curStatLat))
                + ((lon - curStatLon) * (lon - curStatLon)));
        if (curDist < shortestDistSoFar) {
            closestStat = curStat;
        }

        return closestStat;

    }

    @Override
    public void onLocationChanged(Location location) {
        TextView tv = (TextView) findViewById(R.id.locationResults);
        if (location != null) {
            tv.setText(location.getLatitude() + " latitude, "
                    + location.getLongitude() + " longitude");
        } else {
            tv.setText("Problem getting gps NETWORK ID : ");

        }
    }



    @Override
    public void onProviderDisabled(String arg0) {

    }

    @Override
    public void onProviderEnabled(String arg0) {
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    }

}
4

3 に答える 3

2

You can use requestLocationUpdates of LocationManager Class

requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)

So, the first param you can specify as 30 mins according to your requirement.

To keep track of hours elapsed, you can have something like :

var1 = System.CurrentTimeMillis(); //Get time when service started

In onLocationChanged()

var2 = System.CurrentTimeMillis();

Now calculate var2-var1 to get elapsed time. if >17 hrs, removeUpdates from locationManager

于 2013-04-29T16:30:37.230 に答える
0

Schaemelhout が提供するアプローチと、コメントで参照されているライブラリが採用するアプローチは、私が見つけた唯一の実行可能な解決策です。

AlarmManager を使用してサービスを起動すると、サービスが定期的に呼び出されて再起動されることが保証されます。これは、OS/電話がその間にサービスに影響を与える可能性のある省電力アクションを打ち消すのに役立ちます.

アラーム BroadcastReceiver からロケーション リスナーを登録すると、GPS が起動します (電話がスリープ状態の場合、GPS は通常動作しません)。アラーム BroadcastReceiver では、WakeLock を取得して保持し、結果がリスナーに返されるまで起きている必要があります。

このアプローチの欠点は、場所が利用可能になるまでに時間がかかり、精度が悪い可能性があることです. サービスは、許容できる精度が得られるまでしばらく待たなければならない場合があります (場所の精度の値が間違っている可能性があるため、いくつかのサンプルを待つのが最善の方法かもしれません)。アプローチ全体を、必要な更新頻度と精度要件に合わせて調整する必要があります。非常に頻繁で正確な更新が必要な場合は、wake-lock を保持し、GPS を有効にしておくことが唯一の方法かもしれません。

また、PendingIntent を使用して lm.requestLocationUpdates() を使用してみました。これにより、サービスが忠実にウェイクアップされ、インテントが渡されましたが、ウェイクアップ前に GPS がスリープしていた場合、インテントには場所がありませんでした。

于 2014-03-08T20:55:07.927 に答える