我希望用户按下按钮,按下按钮后gps应该在后台自动获取坐标,因为你知道gps可能需要几分钟才能获取坐标,我只想让gps花费时间并在获取坐标后执行一个名为的方法' SendLocationSms',
如果我在doInBackground中使用onLocationChanged方法,则会出错, 或者如果我在不使用异步任务的情况下获取坐标,那么我必须等待坐标,并且在获取之后我可以按下按钮来执行方法SendLocationSms,
我希望用户只需在gps打开时按一个按钮,然后gps花费时间来获取坐标,然后获取然后自动运行我想要的方法而不会注意到用户。
基本上我正在开发一个应用程序,通过短信按下警报按钮发送用户的位置,用户只需要打开GPS并按下警报按钮和应用程序应该做其余的,我不希望该用户等到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需要一两分钟来获取坐标,所以如果我按下按钮之前得到坐标的课程它会发送null作为纬度和经度,所以我想如果仍然gps没有坐标但用户按下按钮,然后应用程序等待直到获取位置然后发送包含纬度和经度的短信。所以这是详细的:)希望现在你可以帮助我,非常感谢
答案 0 :(得分:0)
在您的活动中,您需要记录当前位置。
...
private Location currentLocation;
...
@Override
public void onLocationChanged(Location location) {
currentLocation = location;
}
当用户通过短信点击发送位置时,您现在可以在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.
}
}