代码之家  ›  专栏  ›  技术社区  ›  Muhammad Bin Khalil

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

  •  0
  • Muhammad Bin Khalil  · 技术社区  · 7 年前

    我希望用户按下按钮,按下按钮后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需要一到两分钟才能获取坐标,所以如果我在获取坐标之前按下按钮,它当然会发送空值作为纬度和经度,所以我想如果gps仍然没有获得坐标,但用户按下按钮,然后,应用程序将等待获取位置,然后发送包含纬度和经度信息的短信。所以这是细节:)希望现在你能帮助我,非常感谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   user5156016 user5156016    7 年前

    在活动中,您需要记录当前位置。

    ...
    private Location currentLocation;   
    ...
    
    @Override
    public void onLocationChanged(Location location) {      
    
        currentLocation = location;     
    
    } 
    

    当用户单击通过sms发送位置时,您现在可以在异步任务中使用此变量。

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

    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.
        }      
    
    }