2017-04-25 66 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; 

在这里你去:)