0

こんにちは、私はこのコードを永遠に繰り返したいと思っています。私は多くのことを試みていますが、これについての説明を得ることができませんでした。誰でも私を助けることができますか?このためのサービスは必要ありません。

コード:

public class gps extends Activity implements LocationListener
{
    LocationManager manager;
    String closestStation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        {
            Calendar cur_cal = Calendar.getInstance();
            cur_cal.setTimeInMillis(System.currentTimeMillis());
            cur_cal.add(Calendar.MINUTE, 15);
            Log.d("Testing", "Calender Set time:" + cur_cal.getTime());
            Intent intent = new Intent(gps.this, gps_back_process.class);
            PendingIntent pintent = PendingIntent.getService(gps.this, 0,
                intent, 0);
            AlarmManager alarm_manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,
                cur_cal.getTimeInMillis(), 1000 * 60 * 15, pintent);
            alarm_manager.set(AlarmManager.RTC, cur_cal.getTimeInMillis(),
                pintent);
            Log.d("Testing", "alarm manager set");
            Toast.makeText(this, "gps_back_process.onCreate()",
                Toast.LENGTH_LONG).show();
        }
        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);
        }
        {
            //initialize location manager
            manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //check if GPS is enabled
            //if not, notify user with a toast
            if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER));
            else {
                //get a location provider from location manager
                //empty criteria searches through all providers and returns the best one
                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");
                } else {
                    tv.setText("Last known location not found. Waiting for updated location...");
                }
                manager.requestLocationUpdates(providerName, 1000*60*30 , 1 , this);
            }
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        TextView tv = (TextView)findViewById(R.id.locationResults);
        if (location != null) {
            tv.setText(location.getLatitude() + " latitude, " + location.getLongitude() + " longitude");
            // I have added this line
            appendData ( 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) {}

     // 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;
    }

    // method to write in file
    public void appendData(String text)
    {
        File dataFile = new File(Environment.getExternalStorageDirectory() + "/GpsData.txt");
        if (!dataFile.exists())
        {
            try
            {
                dataFile.createNewFile();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try
        {
            //BufferedWriter for performance, true to set append to file flag
            BufferedWriter buf = new BufferedWriter(new FileWriter(dataFile, true));
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm, dd/MM/yyyy");
            String currentDateandTime = sdf.format(new Date());
           // text+=","+currentDateandTime;
            buf.append(text + "," + currentDateandTime);
            buf.newLine();
            buf.close();
        }
        catch (IOException e)
        {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
    }
}
4

1 に答える 1

0

コードから、位置と近くのステーションを 30 分ごとにフェッチしてログに記録しようとしているように見えます。あなたは単純なことを複雑にしすぎています。

私の意見では、ロケーション プロバイダーのコードを、バックグラウンドで実行し続けるサービスに移動する必要があります。サービス中は、30 分ごとに位置情報の更新を登録します (既に行われているように)。Android は 30 分ごとに LocationListener コールバック メソッドを呼び出し、それに応じてアクションを実行できます (ファイルに保存、通知を表示、Activity にメッセージを送信して UI を更新)。

また、ユーザーの観点から、Ergo が提案しているように、GPS が無効になっていることをユーザーに通知するために 30 分ごとにトーストをポップアップ表示するべきではありません。

于 2013-05-04T07:06:23.417 に答える