2017-04-25 65 views
0

我想從Android設備獲取經緯度並將其發送到MySQL數據庫。當任何一個註冊了當前的經緯度保存在database.but我想知道如何更新,每10 seconds.here保存的經度和緯度是我的代碼:如何在MySQL數據庫中每10秒更新經度和緯度?

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener, GoogleMap.OnCameraMoveListener { 

    GoogleMap mGoogleMap; 
    SupportMapFragment mapFrag; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    double latitude, longitude; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFrag.getMapAsync(this); 

    } 

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


     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(1000); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 


     mLastLocation = location; 
     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 

     mGoogleMap.clear(); 

     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 


     LatLng latLng = new LatLng(latitude, longitude); 

     MarkerOptions markerOptions = new MarkerOptions(); 

     markerOptions.position(latLng); 
     markerOptions.title("Current Position"); 
     mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 
     mCurrLocationMarker.setPosition(latLng); 
     CameraPosition liberty = CameraPosition.builder().target(new LatLng(latitude, longitude)).zoom(15.5f).bearing(0).tilt(45).build(); 
     mGoogleMap.moveCamera(CameraUpdateFactory.newCameraPosition(liberty)); 


     Intent intent = new Intent(MainActivity.this, Register.class); 

     intent.putExtra("Latitude", latitude); 
     intent.putExtra("Longitude", longitude); 
     startActivity(intent); 

     callAsynchronousTask(); 

     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 11)); 


    } 

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

    private void checkLocationPermission() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 


      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.ACCESS_FINE_LOCATION)) { 


       new AlertDialog.Builder(this) 
         .setTitle("Location Permission Needed") 
         .setMessage("This app needs the Location permission, please accept to use location functionality") 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialogInterface, int i) { 

           ActivityCompat.requestPermissions(MainActivity.this, 
             new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
             MY_PERMISSIONS_REQUEST_LOCATION); 
          } 
         }) 
         .create() 
         .show(); 


      } else { 

       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 

     mGoogleMap = googleMap; 
     mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 


     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 

       buildGoogleApiClient(); 
       mGoogleMap.setMyLocationEnabled(true); 
      } else { 

       checkLocationPermission(); 
      } 
     } else { 
      buildGoogleApiClient(); 
      mGoogleMap.setMyLocationEnabled(true); 
     } 
    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_LOCATION: { 

       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        if (ContextCompat.checkSelfPermission(this, 
          Manifest.permission.ACCESS_FINE_LOCATION) 
          == PackageManager.PERMISSION_GRANTED) { 

         if (mGoogleApiClient == null) { 
          buildGoogleApiClient(); 
         } 
         mGoogleMap.setMyLocationEnabled(true); 
        } 

       } else { 

        Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 

     } 
    } 

    @Override 
    public void onCameraMove() { 

     mCurrLocationMarker.setPosition(mGoogleMap.getCameraPosition().target); 

    } 

    public void callAsynchronousTask() { 
     final Handler handler = new Handler(); 
     Timer timer = new Timer(); 
     TimerTask doAsynchronousTask = new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         try { 
          Register performBackgroundTask = new Register(); 

          performBackgroundTask.onSupportContentChanged(); 
         } catch (Exception e) { 
          // TODO Auto-generated catch block 
         } 
        } 
       }); 
      } 
     }; 
     timer.schedule(doAsynchronousTask, 0, 50000); 
    } 
} 

Register class:- 

public class Register extends AppCompatActivity { 

    EditText name_txt, email_txt, mobile_txt; 
    String getname, getemail, getmobilenumber; 
    Button upload, register; 
    TextView image_text; 
    TypedFile avatarFile1 = null; 
    String picturePath = ""; 
    private String userChoosenTask; 
    private int REQUEST_CAMERA = 0, SELECT_FILE = 1; 
    File uri; 
    double getlatitude; 
    double getlongitude; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_register); 

     Find_view_by_id(); 
     Bundle extras = getIntent().getExtras(); 
     getlatitude = extras.getDouble("Latitude"); 
     getlongitude = extras.getDouble("Longitude"); 


     Toast.makeText(this, "Your Location is - \nLat: " + getlatitude + "\nLong: " + getlongitude, Toast.LENGTH_SHORT).show(); 
    } 

    private void Find_view_by_id() { 

     name_txt = (EditText) findViewById(R.id.name); 
     email_txt = (EditText) findViewById(R.id.email); 
     mobile_txt = (EditText) findViewById(R.id.mobilenumber); 
     upload = (Button) findViewById(R.id.upload_image); 
     image_text = (TextView) findViewById(R.id.upload_image_text); 
     register = (Button) findViewById(R.id.register); 

     upload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       selectImage(); 
      } 
     }); 

     register.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       getname = name_txt.getText().toString(); 
       getemail = email_txt.getText().toString(); 
       getmobilenumber = mobile_txt.getText().toString(); 

       if (getname.trim().equalsIgnoreCase("")) { 
        name_txt.setError("Please Enter First Name"); 
        name_txt.requestFocus(); 

       } else if (getemail.trim().equalsIgnoreCase("")) { 
        email_txt.setError("Please Enter email address"); 
        email_txt.requestFocus(); 
       } else if (!getemail.matches("[a-zA-Z0-9._-][email protected][a-z]+.[a-z]+")) { 
        email_txt.setError("Please Enter valid email address"); 
        email_txt.requestFocus(); 
       } else if (getmobilenumber.trim().equalsIgnoreCase("")) { 

        mobile_txt.setError("Please enter mobile number"); 
        mobile_txt.requestFocus(); 
       } else if (getmobilenumber.length() < 10) { 
        mobile_txt.setError("Please Enter correct mobile number"); 
        mobile_txt.requestFocus(); 
       } else { 
        Register_user(getname, getemail, getmobilenumber, picturePath, getlatitude, getlongitude); 
       } 
      } 

      private void Register_user(String name, String email, String mobilenumber, String avatarFile, Double latitud_e, Double longitud_e) { 

       if (avatarFile != null) { 
        avatarFile1 = new TypedFile("image/*", new File(String.valueOf(avatarFile))); 
       } 

       RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Constant.constant).build(); 
       Register_API registerapi = restAdapter.create(Register_API.class); 

       registerapi.getuser(name, email, mobilenumber, avatarFile1, latitud_e, longitud_e, new Callback<RegisterModel>() { 
        @Override 
        public void success(RegisterModel registerModel, Response response) { 

         Long status = registerModel.getSuccess(); 

         if (status == 1) { 

          name_txt.setText(""); 
          email_txt.setText(""); 
          mobile_txt.setText(""); 
          image_text.setText(""); 
          Toast.makeText(Register.this, "Successful ", Toast.LENGTH_SHORT).show(); 

          Intent i = new Intent(Register.this, Show_List_Activity.class); 
          startActivity(i); 
         } 
        } 

        @Override 
        public void failure(RetrofitError error) { 

         Toast.makeText(Register.this, "Failure ", Toast.LENGTH_SHORT).show(); 

        } 
       }); 
      } 
     }); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case Utility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        if (userChoosenTask.equals("Take Photo")) 
         cameraIntent(); 
        else if (userChoosenTask.equals("Choose from Library")) 
         galleryIntent(); 
       } else { 

       } 
       break; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == Activity.RESULT_OK) { 
      if (requestCode == SELECT_FILE) { 
       onSelectFromGalleryResult(data); 
      } else if (requestCode == REQUEST_CAMERA) { 
       Log.e("log path", "" + uri); 
       String myImagename = getImageName(String.valueOf(uri)); 
       image_text.setText(myImagename); 
      } 

     } 

    } 


    private String getImageName(String picturePath) { 
     String Imagename = null; 

     String[] name_array = picturePath.split("/"); 
     Log.e("size of array", "" + name_array.length); 

     Imagename = name_array[name_array.length - 1]; 

     Log.e("name of image", "" + Imagename); 

     return Imagename; 
    } 

    private void selectImage() { 

     final CharSequence[] items = {"Take Photo", "Choose from Library", 
       "Cancel"}; 

     AlertDialog.Builder builder = new AlertDialog.Builder(Register.this); 
     builder.setTitle("Add Photo!"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       boolean result = Utility.checkPermission(Register.this); 

       if (items[item].equals("Take Photo")) { 
        userChoosenTask = "Take Photo"; 
        if (result) 
         cameraIntent(); 

       } else if (items[item].equals("Choose from Library")) { 
        userChoosenTask = "Choose from Library"; 
        if (result) 
         galleryIntent(); 

       } else if (items[item].equals("Cancel")) { 
        dialog.dismiss(); 
       } 
      } 
     }); 
     builder.show(); 
    } 

    private void galleryIntent() { 
     Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

     startActivityForResult(intent, SELECT_FILE); 
    } 

    private void cameraIntent() { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     uri = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
     startActivityForResult(intent, REQUEST_CAMERA); 

    } 

    private static File getOutputMediaFile(int type) { 

     File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/.Dope/"); 

     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 

       return null; 
      } 
     } 

     File mediaFile; 
     java.util.Date date = new java.util.Date(); 
     if (type == MEDIA_TYPE_IMAGE) { 
      mediaFile = new File(mediaStorageDir, Long.toString(System.currentTimeMillis()) + "IMG_" + new Timestamp(date.getTime()).toString() + ".jpg"); 
     } else { 
      return null; 
     } 
     return mediaFile; 
    } 

    @SuppressWarnings("deprecation") 
    private void onSelectFromGalleryResult(Intent data) { 

     Bitmap bm = null; 
     if (data != null) { 

      Uri selectedImage = data.getData(); 
      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 


      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      String myimagename = getImageName(picturePath); 

      image_text.setText(myimagename); 


     } 


    } 
} 
+0

在你的問題中至少有3個不同的任務:1)每10秒獲取座標。 2)將它們發送到後端。 3)將座標保存到後端的MySQL數據庫。你應該分開解決它們。那麼這3個任務中的哪一個是你的問題? –

+0

我得到了當前座標並正確保存在數據庫中。但我的問題是如何更新我的設備移動時保存的經度和緯度。 @VladMatvienko –

回答

0

創建一個後臺服務類這樣

public class LocationBackGroundService extends Service implements LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = "LocationBackGroundService"; 
    private static final long INTERVAL = 100; 
    private static final long FASTEST_INTERVAL = 100; 

    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mCurrentLocation; 
    Context mCOntext; 

    public void LocationBackGroundService(Context mContext) { 
     this.mCOntext = mContext; 
    } 

    protected void createLocationRequest() { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(INTERVAL); 
     mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     mGoogleApiClient.connect(); 
    } 

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

     if (!isGooglePlayServicesAvailable()) { 
      // finish(); 
     } 
     createLocationRequest(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     if (mGoogleApiClient.isConnected()) { 
      startLocationUpdates(); 
     } 
    } 

    private boolean isGooglePlayServicesAvailable() { 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     if (ConnectionResult.SUCCESS == status) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     startLocationUpdates(); 
    } 


    protected void startLocationUpdates() { 
     PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
       mGoogleApiClient, mLocationRequest, this); 

     Log.d(TAG, "Location update started ..............: "); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

     Toast.makeText(this, "OnConnection Suspended", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Toast.makeText(this, "OnConnection Failed", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     if (null != mCurrentLocation) { 
      mCurrentLocation = location; 
      String lat = String.valueOf(mCurrentLocation.getLatitude()); 
      String lng = String.valueOf(mCurrentLocation.getLongitude()); 

     } 
    } 
} 

而且打電話的時候,活動開始這樣

startService(new Intent(this, yourBackgroundServiceName.class)); 

和menifest

<service android:name=".yourBackgroundServiceName"></service> 

和唐;噸忘記添加運行在陳述服務之前的時間許可

+0

無法解決此問題// @ SuppressLint(「LongLogTag」) protected void startLocationUpdates(){ PendingResult pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,this); Log.d(TAG,「位置更新開始..............:」); } //在這裏添加任何依賴項? –

+0

是添加這些編譯'com.google.android.gms:play-services:9.2.0' compile'c​​om.google.android.gms:play-services-location:9.2.0' – AbhayBohra

+0

好吧,然後嘗試刪除@ SuppressLint(「LongLogTag」) – AbhayBohra

2

你必須使用線程爲此,隨着時間的推移了10秒鐘,每10秒你在線程代碼將運行

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // This method will be executed once the timer is over 
      // insert your data to db here 


      // close this activity 
      finish(); 
     } 
    }, TIME_OUT); 

並設置超時時間爲

private static int TIME_OUT = 10000; 

在這裏你去:)