2

サービスを使用してユーザーの位置を追跡し、データをバックグラウンドでサーバーに送信するアプリケーションを開発しています。GPSベースのアプリです。私のプログラムが GPS プロバイダーで requestLocationUpdates を呼び出したときに、onLocationChanged が呼び出されることはありません。ただし、requestLocationUpdates は、アプリのネットワーク プロバイダーで正常に動作します。私のコードを見てください。

Android バージョン: 4.1.2 端末: Galaxy nexus S

トラッカー.java

private void init() {
    locationListener = new MyLocationListener();
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    NOTIFICATION = R.string.local_service_started;
    arrivedStatus = false;
    activity = TrackerActivity.getAppActivity();
}

@Override
public void onCreate() {
    super.onCreate();
    init();
    Log.i(tag, "Start Tracking");
    showStartNotification();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("LocalService", "Received start id " + startId + ": " + intent);
    tripID = intent.getExtras().getInt("tripID") + "";
    locationInterval = intent.getExtras().getInt("locationInterval")
            * MILLISECONDS_PER_SECOND;
    //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
    //      locationInterval, 0, locationListener);
    getLocation();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e("STOP_SERVICE", "Service has stopped");
    mNM.cancel(R.string.local_service_started);
    lm.removeUpdates(locationListener);
    stopSelf();
}

private void getLocation() {
    lm = (LocationManager) getApplicationContext().getSystemService(
            Context.LOCATION_SERVICE);

    // getting GPS status
    isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

    // getting network status
    isNetworkEnabled = lm
            .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if (!isGPSEnabled && !isNetworkEnabled) {
        // no network provider is enabled
        Log.e(tag, "Non providers are enabled");
    } else {

        if (isGPSEnabled) {
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    locationInterval, 0, locationListener);
            Log.d(tag, "GPS Enabled");
        }

        if (isNetworkEnabled) {
            if (lm == null) {
                lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                        locationInterval, 0, locationListener);
                Log.d(tag, "Network Enabled");
            }
        }
    }
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@SuppressWarnings("deprecation")
private void showStartNotification() {
    // In this sample, we'll use the same text for the ticker and the
    // expanded notification
    CharSequence text = getText(R.string.local_service_started);

    // Set the icon, scrolling text and timestamp
    Notification notification = new Notification(R.drawable.cameral, text,
            System.currentTimeMillis());

    // The PendingIntent to launch our activity if the user selects this
    // notification+
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, TrackerActivity.class), 0);

    // Set the info for the views that show in the notification panel.
    notification.setLatestEventInfo(this,
            getText(R.string.local_service_label), text, contentIntent);

    // Send the notification.
    mNM.notify(NOTIFICATION, notification);
}

/**
 * private void showStopSpecification() { CharSequence text =
 * getText(R.string.local_service_cancel); Notification notification = new
 * Notification(R.drawable.btn_save_dialog, text,
 * System.currentTimeMillis()); mNM.notify(NOTIFICATION, notification); }
 */

private void checkResult(JSONObject json) {
    try {
        if (json.getString(KEY_SUCCESS) != null) {
            String res = json.getString(KEY_SUCCESS);
            if (Integer.parseInt(res) == 1) {
                Log.v(tag, "Store data successfully");
                activity.findViewById(R.id.tracker_info)
                        .setBackgroundResource(R.color.blue4);
                if (json.getInt(ARRIVED_STATUS) == 1) {
                    setArrivedStatus(true);
                } else {
                    setArrivedStatus(false);
                }
            } else if (json.getString(KEY_ERROR).equals("1")) {
                // Error in login
                String error_msg = json.getString(KEY_ERROR_MSG);
                Log.e(tag, error_msg);
                setArrivedStatus(false);
            } else {
                Log.e(tag, "Something is wrong");
                setArrivedStatus(false);
            }
        } else {
            Log.e(tag, "Something is wrong");
            setArrivedStatus(false);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void setArrivedStatus(boolean status) {
    arrivedStatus = status;
}

public boolean getArrivedStatus() {
    return arrivedStatus;
}

private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        currentLat = location.getLatitude() + "";
        currentLng = location.getLongitude() + "";
        Log.v(tag, LOCATION_CHANGED + " lat=" + currentLat + ", lon="
                + currentLng);
        try {
            JSONObject json = new LogInfo().execute(
                    new String[] { tripID, currentLat, currentLng }).get();
            checkResult(json);
            if (getArrivedStatus() == true) {
                Log.v(tag, "User has arrived safely");
                onDestroy();
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

}

}

マニフェストへのアクセス許可も既に追加しました

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

ありがとうございました

4

1 に答える 1

0

この関数を呼び出すと、デバイスの通知バーに GPS アイコンが表示されますか? もしそうなら、それは位置を取得しようとしていて、GPS 受信のない場所にいることを意味します.

いずれにせよ、Google の方法を使用して場所を取得できます。こちら: https://developers.google.com/events/io/sessions/324498944

また、クラス「トラッカー」とは何ですか?それはサービスですか?その場合、メモリ リークが発生する可能性があるため、アクティビティへの参照を許可しないでください。代わりに正しいバインディングを使用してください。

"onDestroy" の呼び出しも避ける必要があります。これを呼び出しても実際にはサービスが閉じられないためです。代わりに「stopSelf」を呼び出し、アクティビティがバインドされていないことを確認してください。

ご希望であれば、私はずっと前にこの種の (サービスを介して場所を取得する) 質問をしたことがあります

于 2013-09-07T18:39:01.330 に答える