1

ユーザーの現在の場所を見つけたい小さなAndroidアプリケーションを開発しています。ユーザーの位置を検出するための私のコード構造は次のようになります。

private void sendSMS(Context context, Intent intent)
{ 
     final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
     final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds

     LocationManager locationManager;
     locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

     locationManager.requestLocationUpdates(
         LocationManager.GPS_PROVIDER, 
     MINIMUM_TIME_BETWEEN_UPDATES, 
     MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
    new MyLocationListener()
     );

     Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
     String loc_message = null;

     if (location != null) 
     {
     loc_message =String.format(
         "Current Location \n Longitude: %1$s \n Latitude: %2$s",
         location.getLongitude(), location.getLatitude()
      );
    Toast.makeText(context, loc_message,Toast.LENGTH_LONG).show();
     }
}   
 private class MyLocationListener implements LocationListener {

         public void onLocationChanged(Location location) {
         String message = String.format(
                 "New Location \n Longitude: %1$s \n Latitude: %2$s",
                 location.getLongitude(), location.getLatitude()
         );
     }

     public void onStatusChanged(String s, int i, Bundle b) {

     }

     public void onProviderDisabled(String s) {
     }

     public void onProviderEnabled(String s) {
     }
     }
}

DDMSから座標を送信するシミュレーターで正常に動作しています。しかし、デバイスで実行すると、出力が得られません。デバイスでは、[GPS 衛星を使用] を有効のままにします。しかし、ユーザーの場所を見つけようとすると、出力が得られません....助けが必要です...ありがとう.......

4

2 に答える 2

1

Serviceこれが私の追跡アプリケーションで使用したGPSのスケルトンであり、テスト済みであり、正常に動作することを保証できます。お役に立てば幸いです。

import java.util.Timer;
import java.util.TimerTask;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.preference.PreferenceManager;
import android.util.Log;

public class TrackingService extends Service {
    private static final String TAG = TrackingService.class.getSimpleName();

    private static final long TIME_BETWEEN_UPDATES = 1000L;
    private static final long MINIMUM_DISTANCE_CHANGE = 0L;

    private WakeLock mWakeLock;

    private LocationManager mLocationManager;

    private final Timer mTimer = new Timer();
    private Handler mHandler = new Handler();

    private LocationListener mLocationListenerGps = new LocationListener() {

        public void onLocationChanged(Location location) {
            // Your code here
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    };

    private void registerLocationListener() {
        if (mLocationManager == null) {
            Log.e(TAG, "TrackingService: Do not have any location manager.");
            return;
        }
        Log.d(TAG, "Preparing to register location listener w/ TrackingService...");
        try {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE, mLocationListenerGps);
            Log.d(TAG, "...location listener now registered w/ TrackingService @ " + TIME_BETWEEN_UPDATES);
        } catch (RuntimeException e) {
            Log.e(TAG, "Could not register location listener: " + e.getMessage(), e);
        }
    }

    private void unregisterLocationListener() {
        if (mLocationManager == null) {
            Log.e(TAG, "TrackingService: Do not have any location manager.");
            return;
        }
        mLocationManager.removeUpdates(mLocationListenerGps);
        Log.d(TAG, "Location listener now unregistered w/ TrackingService.");
    }

    private TimerTask mCheckLocationListenerTask = new TimerTask() {
        @Override
        public void run() {
            mHandler.post(new Runnable() {
                public void run() {
                    Log.d(TAG, "Re-registering location listener with TrackingService.");
                    unregisterLocationListener();
                    registerLocationListener();
                }
            });
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();

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

        registerLocationListener();

        mTimer.schedule(mCheckLocationListenerTask, 1000 * 60 * 5, 1000 * 60);

        acquireWakeLock();

        Log.d(TAG, "Service started...");
    }

    @Override
    public void onStart(Intent intent, int startId) {
        handleStartCommand(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handleStartCommand(intent, startId);
        return START_STICKY;
    }

    private void handleStartCommand(Intent intent, int startId) {
        Notification notification = new Notification(R.drawable.ic_launcher,
                getText(R.string.trackingservice_notification_rolling_text),
                System.currentTimeMillis());

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class),
                PendingIntent.FLAG_UPDATE_CURRENT);

        notification.setLatestEventInfo(this,
                getText(R.string.trackingservice_notification_ticker_title),
                getText(R.string.trackingservice_notification_ticker_text),
                contentIntent);

        startForeground(1, notification);
    }

    @Override
    public void onDestroy() {
        stopForeground(true);
        mTimer.cancel();
        mTimer.purge();
        mHandler.removeCallbacksAndMessages(null);
        unregisterLocationListener();
        releaseWakeLock();
        super.onDestroy();
        Log.d(TAG, "Service stopped...");
    }

    private void acquireWakeLock() {
        try {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            if (pm == null) {
                Log.e(TAG, "TrackRecordingService: Power manager not found!");
                return;
            }
            if (mWakeLock == null) {
                mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
                if (mWakeLock == null) {
                    Log.e(TAG, "TrackRecordingService: Could not create wake lock (null).");
                    return;
                }
            }
            if (!mWakeLock.isHeld()) {
                mWakeLock.acquire();
                if (!mWakeLock.isHeld()) {
                    Log.e(TAG, "TrackRecordingService: Could not acquire wake lock.");
                }
            }
        } catch (RuntimeException e) {
            Log.e(TAG, "TrackRecordingService: Caught unexpected exception: "
                    + e.getMessage(), e);
        }
    }

    /**
     * Releases the wake lock if it's currently held.
     */
    private void releaseWakeLock() {
        if (mWakeLock != null && mWakeLock.isHeld()) {
            mWakeLock.release();
            mWakeLock = null;
        }
    }
}

そしてあなたのAndroidManifest.xmlファイルであなたは必要です

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

GPSロケーションリスナーに記入し、サービスを登録しAndroidManifest.xml、アクティビティからサービスを開始してお楽しみください。

于 2012-07-04T10:10:25.203 に答える
0

Nilkash さん、Samsung Galaxy 5 でも同じ問題が発生しました。

ネットワークプロバイダーを変更するというあなたの提案のおかげで、私の問題は解決しました. その相棒をありがとう。私は解決策を得ました。

「ネットワーク プロバイダー」は、セル タワーと WiFi アクセス ポイントの可用性に基づいて場所を決定します。結果は、ネットワーク ルックアップによって取得されます。アクセス許可 android.permission.ACCESS_COARSE_LOCATION または android.permission.ACCESS_FINE_LOCATION のいずれかが必要です。

ただし、「GPS プロバイダー」は衛星を使用して位置を特定します。条件によっては、このプロバイダーが場所の修正を返すまでに時間がかかる場合があります。アクセス許可 android.permission.ACCESS_FINE_LOCATION が必要です。

これはデバイスの問題です。私たちのデバイスはインターネットなしでは GPS をサポートしておらず、ロケーション プロバイダーのみを使用しています。

于 2012-08-31T05:01:11.903 に答える