0

バックグラウンドでデバイスの位置をログ ファイルに記録する Android ソフトウェアのトラブルを調査しています。コードは次のようになります。

package com.otpc.auto;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

public class LocationUpdate extends Service {
    private String TAG = "LocationUpdate";
    private LocationManager loc;
    private class CustomLocationListener implements LocationListener {
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        public void onProviderEnabled(String provider) {
        }
        public void onProviderDisabled(String provider) {
        }
        public void onLocationChanged(Location location) {
            writeLocationData(location);
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show();
        loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100,
                new CustomLocationListener(), 
                Looper.myLooper());
        loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100,
                new CustomLocationListener(), 
                Looper.myLooper());
        return Service.START_STICKY;
    }
    private void writeLocationData(Location location){
        final double latitude = location.getLatitude();
        final double lon = location.getLongitude();
        new Thread(){
            public void run() {
                try {
                    FileOutputStream latitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/latitude.txt");
                    latitudeFile.write(String.valueOf(latitude).getBytes());
                    latitudeFile.close();
                    FileOutputStream longitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/longitude.txt");
                    longitudeFile.write(String.valueOf(lon).getBytes());
                    longitudeFile.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }
}

これをスタートアップサービスとして登録すると、他のアプリはGPSサービスを利用できなくなります。GPS テスター アプリケーションで GPS をテストすると、デバイスに GPS がない場合と同様の結果が得られます。このアプリケーションをデバイスから削除すると、GPS が正常に機能するようになります。

上記のコードの何が問題になっていますか。私は Android の専門家ではありませんが、私が見たところ、コードに異常を見つけることはできません。

ありがとう。

4

2 に答える 2

0

Looper.myLooper()ロケーション コールバックを登録するときに を削除してみてください。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show();
    loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100,
            new CustomLocationListener());
    loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100,
            new CustomLocationListener());
    return Service.START_STICKY;
}

登録する場合は、メッセージ キューを使用してコールバック メカニズムを実装するためにLooper.myLooper()呼び出されたシステム スレッドを登録しているため、バックグラウンドで問題が発生している可能性があります。onStartCommand()

于 2013-08-05T19:34:40.663 に答える