0

これはしばらくしてこの問題を解決するようになっています。LocationListenerとHttpUrlConnectionポストデータを使用したAsyncTaskのインスタントロケーション

私はAsyncTaskを持っています。このAsyncTaskは、ユーザーのネットワークロケーションを20秒ごとに取得し、リモートサーバーにデータを送信します。

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

属し示すように、私はここでMainActivitiyのOnCreate関数()とコード

public class TraficMain extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     setContentView(R.layout.activity_main); 

     new UrlPositionAsynck().execute(); 
    } 

    private class UrlPositionAsynck extends AsyncTask<Void, Void , String> { 

     public double longitude, latitude; 
     public URL url; 
     protected LocationManager locationManager; 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     } 

     @Override 
     protected String doInBackground(Void... urlink) { 

      GPSPosition gpsPosition = new GPSPosition(TraficMain.this); 

      locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 20000, 0, gpsPosition); 

      Position position = gpsPosition.getPosition(); 

      String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude(); 

      try { 
       url = new URL("http://myremote_url"); 
       byte[] param=params.getBytes("UTF-8"); 
       int postLength=param.length; 
       HttpURLConnection strConn = (HttpURLConnection) url.openConnection(); 
       strConn.setDoOutput(true); 
       strConn.setInstanceFollowRedirects(false); 
       strConn.setRequestMethod("POST"); 
       strConn.setConnectTimeout(60000); 
       strConn.setChunkedStreamingMode(0); 
       strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       strConn.setRequestProperty("charset", "utf-8"); 
       strConn.setRequestProperty("Content-Length", Integer.toString(postLength)); 
       strConn.setUseCaches(false); 
       OutputStream out=strConn.getOutputStream(); 
       BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream())); 
       data.write(params); 
       data.flush(); 
       data.close(); 
       out.flush(); 
       out.close(); 

       BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream()))); 
       StringBuilder sb = new StringBuilder(); 
       String output; 
       while ((output = br.readLine()) != null) { 
        sb.append(output); 
       } 
      }catch(IOException io){ 
       Log.i("Connection Problem :", io.getMessage()); 
      } 

      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 
    } 
} 

の残りの部分があるの権限を要求してきたと私はその実装このクラスで場所を取得しますLocationListener

public class GPSPosition implements LocationListener{ 

    Activity myContext; 
    public double longitude, latitude; 

    public GPSPosition(Activity context){ 
     this.myContext=context; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     longitude = location.getLongitude(); 
     latitude = location.getLatitude(); 

     TextView txt = (TextView) this.myContext.findViewById(R.id.txtPosition); 
     txt.setText(longitude + ", " + latitude); 
    } 

    @Override 
    public void onProviderDisabled(String provider) {} 

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

    @Override 
    public void onProviderEnabled(String provider) {} 

    public Position getPosition(){ 
     return new Position(this.longitude, this.latitude); 
    } 

このコードに問題があります。私はアプリが起動され、緯度と経度が常に0に等しいときにのみデータをポストします。

私は20秒ごとにリモートサーバーにデータを投稿することを期待していました。 誰かがこれを解決する方法を教えてもらえますか?私は週末を過ごしています

編集 これはonCreate()の新しいコードです。 デバイスが位置を変更したとしても、位置の値は変更されず、なぜこれが起こっているのか分かりません。

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    setContentView(R.layout.activity_main); 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      final GPSPosition gpsPosition = new GPSPosition(TraficMain.this); 

      locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, gpsPosition); 
      new UrlPositionAsynck().execute(gpsPosition.getPosition()); 
     } 
    }, 20000); 
} 

private class UrlPositionAsynck extends AsyncTask<Position, Void , String> { 
    public double longitude, latitude; 
    public URL url; 
    protected LocationManager locationManager; 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 

    @Override 
    protected String doInBackground(Position... urlink) { 

     Position position = urlink[0]; 

     String params= "lb_lo=" + position.getLb_longitude() + "&lb_la=" + position.getLb_latitude(); 

     try { 
      url = new URL("http://remote_url"); 
      byte[] param=params.getBytes("UTF-8"); 
      int postLength=param.length; 
      HttpURLConnection strConn = (HttpURLConnection) url.openConnection(); 
      strConn.setDoOutput(true); 
      strConn.setInstanceFollowRedirects(false); 
      strConn.setRequestMethod("POST"); 
      strConn.setConnectTimeout(60000); 
      strConn.setChunkedStreamingMode(0); 
      strConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      strConn.setRequestProperty("charset", "utf-8"); 
      strConn.setRequestProperty("Content-Length", Integer.toString(postLength)); 
      strConn.setUseCaches(false); 

      OutputStream out=strConn.getOutputStream(); 
      BufferedWriter data =new BufferedWriter(new OutputStreamWriter(strConn.getOutputStream())); 
      data.write(params); 
      data.flush(); 
      data.close(); 
      out.flush(); 
      out.close(); 

      BufferedReader br = new BufferedReader(new InputStreamReader((strConn.getInputStream()))); 
      StringBuilder sb = new StringBuilder(); 
      String output; 
      while ((output = br.readLine()) != null) { 
       sb.append(output); 
      } 
     }catch(IOException io){ 
      io.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
} 
+0

ような何かを行うことによって、ハンドラを作成し、すべての20秒後にそれを実行することができます。 –

+0

doInBackGroundの中にLoopを追加する必要があるのですか? –

答えて

0

あなたも一度ごAsyncTaskを実行しているこの

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
new UrlPositionAsynck().execute(); 
     //Do something after 20 seconds 
     handler.postDelayed(this, 20000); 
    } 
}, 1000); 
+0

このコードの平和は役に立ちました。私はリモートに接続することができますが、問題はまだ解決されていません。位置の値は変更されていません –

+0

マニフェストにアクセス権の粗い位置の権限がありません –

関連する問題