Android 使用异步任务在后台获取经度和纬度

Android 使用异步任务在后台获取经度和纬度,android,android-asynctask,gps,location,android-gps,Android,Android Asynctask,Gps,Location,Android Gps,我希望用户按下按钮,按下按钮后,gps应在后台自动获取坐标,因为您知道gps可能需要几分钟来获取坐标,我只希望gps抓紧时间,在获取坐标后,执行一个名为“SendLocationSms”的方法 如果我在doInBackground中使用onLocationChanged方法,它会给出一个错误, 或者,如果我没有使用异步任务获取坐标,那么我必须等待坐标,在获取之后,我可以按下按钮执行方法SendLocationSms 我希望用户只需在gps打开时按下一个按钮,然后gps就需要花费足够的时间来获取坐

我希望用户按下按钮,按下按钮后,gps应在后台自动获取坐标,因为您知道gps可能需要几分钟来获取坐标,我只希望gps抓紧时间,在获取坐标后,执行一个名为“SendLocationSms”的方法

如果我在doInBackground中使用onLocationChanged方法,它会给出一个错误, 或者,如果我没有使用异步任务获取坐标,那么我必须等待坐标,在获取之后,我可以按下按钮执行方法SendLocationSms

我希望用户只需在gps打开时按下一个按钮,然后gps就需要花费足够的时间来获取坐标,在获取坐标后,在不通知用户的情况下自动运行我想要的方法

基本上,我正在开发一个应用程序,通过短信发送用户的位置按下警报按钮,用户只需打开gps和按下警报按钮nd应用程序应该做其余的,我不希望用户等到gps获取坐标发送警报

请帮帮我

public class MainActivity extends AppCompatActivity implements LocationListener {


private LocationManager n;
private double lat;
private double lot;
private Button save;

private TextView textSMS;
private String gps;
private String sms;
public Button con;
DatabaseHelper myDb;

String id, cell1;




protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    con = (Button) findViewById(R.id.con);
    con.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this, Contacts.class);
            startActivity(i);
        }
    });

    myDb = new DatabaseHelper(this);



    Cursor c = myDb.getAllData();
    c.moveToFirst();
    cell1 = (c.getString(1));



    save = (Button) findViewById(R.id.save);
    textSMS = (TextView) findViewById(R.id.editTextSMS);

    textSMS.setText("Help me please im at: [location]");
    sms="Help me please im at: ";







    n = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    n.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 100, this);


    save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            if ( gps != null ) {



                try {
                    SmsManager smsManager = SmsManager.getDefault();
                    smsManager.sendTextMessage(cell1.toString(), null, sms + gps, null, null);
                    Toast.makeText(getApplicationContext(), "Your message sent successfuly !",
                            Toast.LENGTH_LONG).show();

                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(),
                            "SMS failddddd!",
                            Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }




        }
    });


}


@Override
public void onLocationChanged(final Location l) {

    this.lat=l.getLatitude();
    this.lot=l.getLongitude();
    this.gps = "\n" +
            "www.google.com/maps/place/"+lat+","+lot;

    TextView locc = (TextView) findViewById(R.id.locc);
    locc.setTextColor(Color.GREEN);
    locc.setText("New Location Fetched !");




    Toast.makeText(getApplicationContext(), "Location done", Toast.LENGTH_LONG).show();








        }






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

}

@Override
public void onProviderEnabled(String provider) {

    Toast.makeText(getBaseContext(),"Gps enabled",Toast.LENGTH_LONG).show();




}

@Override
public void onProviderDisabled(String provider) {


    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
    Toast.makeText(getBaseContext(), "Gps is turned off!! ",
            Toast.LENGTH_SHORT).show();



}

public void showMessage(String title,String Message){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(Message);
    builder.show();
}
}


听着,在点击活动中的按钮时,我想通过短信发送经度和纬度,我打开gps,然后按下按钮,但你们知道gps需要一两分钟来获取坐标,所以若我在获取坐标之前按下按钮,它当然会发送空值作为经度和纬度,所以我想,如果gps仍然没有得到坐标,但用户按下了按钮,那么应用程序将等待,直到获取位置,然后发送包含纬度和经度的短信。这就是细节:)希望现在你能帮助我,非常感谢你在活动中需要记录当前位置

...
private Location currentLocation;   
...

@Override
public void onLocationChanged(Location location) {      

    currentLocation = location;     

} 
当用户通过sms单击发送位置时,您现在可以在asyncTask中使用此变量

不要忘记在代码中的某个地方请求位置更新,例如,请看以下内容:

LocationRequest REQUEST = LocationRequest.create()  // LocationRequest parameters definition.
        .setInterval(30000)         
        .setFastestInterval(16)    // 16ms = 60fps
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

if(googleApiClient.isConnected()){ 
           LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, REQUEST, this);
}
编辑: 您可以选择以下选项。添加一个布尔值,通知用户要发送当前位置,当位置准备就绪时,您可以发送它。因此,您必须以以下方式修改onclick侦听器和位置更新侦听器:

...
private boolean needSendSMS = false;
...

save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if ( gps != null ) {
            try {
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(cell1.toString(), null, sms + gps, null, null);
                Toast.makeText(getApplicationContext(), "Your message sent successfuly !",
                        Toast.LENGTH_LONG).show();

            } catch (Exception e) {
                Toast.makeText(getApplicationContext(),
                        "SMS failddddd!",
                        Toast.LENGTH_LONG).show();
                e.printStackTrace();
        }
        else{
            needSendSMS = true;
        }

    }

...
@Override
public void onLocationChanged(Location l) {      

    this.lat=l.getLatitude();
    this.lot=l.getLongitude(); 
    if ( needSendSMS) {
        needSendSMS=false;
        // Send your sms like you did before.
    }      

} 

您可以使用IntentService请详细告诉我,如果可以,我是Android的新手如果您真的需要在后台执行此操作,IntentService可以通过活动访问所有可访问的内容,并且可以在您的后台工作。但这里真正的问题是,为什么需要在后台执行此操作?您可以直接将代码放入onLocationChanged或onConnected@JawadLeWywadi我想通过短信发送位置,如果用户按下警报按钮,而不是每次获取位置时,:)请告诉此解决方案如果不清楚,请发布您的代码,以便我们可以通过指出您应该添加修改代码的位置来提供帮助。但我想在sms中单独发送经度和纬度,如何从此variablecurrentLocation.getLatitude()获取经度和纬度;和currentLocation.getLongitude();在asynktask中,您应该执行必要的操作,但是纬度和经度将对您可用,因为currentLocation将是您活动的一个属性。好的,亲爱的JAWAD听着,单击活动中的按钮,我想通过短信发送经度和纬度,我打开gps,然后按按钮,但你们知道gps获取坐标需要一到两分钟,所以若我在获取坐标之前按下按钮,它当然会发送空值作为纬度和经度,所以我想,若gps仍然并没有获取坐标,但用户按下了按钮,那个么应用程序应该等到获取到位置,然后发送包含纬度和经度的短信。这就是细节:)希望现在你能帮助我,非常感谢