在到达某个位置时在 Android 中发送短信

Posted

技术标签:

【中文标题】在到达某个位置时在 Android 中发送短信【英文标题】:Sending Sms in Android on reaching a Location 【发布时间】:2017-08-09 06:59:45 【问题描述】:

我是 android 的绝对初学者。在这段代码中,我想在到达特定位置时发送短信。如果我将短信管理器放在 onlocationchange() 函数之外,我的应用程序会崩溃。所以如果我没有离开 10 米的距离,它会发送连续的短信。我只想让它只发送一条短信。请帮忙!!

MainActivity.java

    protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtLat = (TextView) findViewById(R.id.textview1);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,10, this);
     catch (SecurityException e)
    
        txtLat = (TextView) findViewById(R.id.textview1);
        txtLat.setText("Security Exception");

    


@Override
public void onLocationChanged(Location location) 
    txtLat = (TextView) findViewById(R.id.textview1);
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
    float dist1=getsignaldistance(location);
    tx=(TextView)findViewById((R.id.textview2));
    tx.setText("Distance for next signal:"+Float.toString(dist1)+"m");
    checksendsms(location);


private void checksendsms(Location location) 
    Location strpoint=new Location("strpoint");
    strpoint.setLatitude(location.getLatitude());
    strpoint.setLongitude(location.getLongitude());
    Location endpoint=new Location("endpoint");
    endpoint.setLatitude(10.813763);
    endpoint.setLongitude(78.644309);
    float dist=strpoint.distanceTo(endpoint);
    tx=(TextView)findViewById((R.id.textview3));
    tx.setText("Distance between points:"+Float.toString(dist)+"m");
    if(dist<=10.0)
    
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phonenumber, null, message, null, null);
        finish();
    


【问题讨论】:

您需要保留一个标志(布尔值),指示短信是否已发送。 【参考方案1】:

您需要保留一个标志(布尔值)来指示短信是否已发送。

private boolean mHasSmsBeenSent = false; // <--- HERE

protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtLat = (TextView) findViewById(R.id.textview1);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,10, this);
     catch (SecurityException e)
    
        txtLat = (TextView) findViewById(R.id.textview1);
        txtLat.setText("Security Exception");

    


@Override
public void onLocationChanged(Location location) 
    txtLat = (TextView) findViewById(R.id.textview1);
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
    float dist1=getsignaldistance(location);
    tx=(TextView)findViewById((R.id.textview2));
    tx.setText("Distance for next signal:"+Float.toString(dist1)+"m");
    if(!mSmsHasBeenSent)         // <-- HERE
        checksendsms(location);
    


private void checksendsms(Location location) 
    Location strpoint=new Location("strpoint");
    strpoint.setLatitude(location.getLatitude());
    strpoint.setLongitude(location.getLongitude());
    Location endpoint=new Location("endpoint");
    endpoint.setLatitude(10.813763);
    endpoint.setLongitude(78.644309);
    float dist=strpoint.distanceTo(endpoint);
    tx=(TextView)findViewById((R.id.textview3));
    tx.setText("Distance between points:"+Float.toString(dist)+"m");
    if(dist<=10.0)
    
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phonenumber, null, message, null, null);
        mHasSmsBeenSent = true; // <--- HERE
        finish();
    


【讨论】:

哎呀一个错误!谢谢你解决了我的问题!!【参考方案2】:

你好去掉Activity的onDestroy中的位置回调..

protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtLat = (TextView) findViewById(R.id.textview1);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,10, this);
     catch (SecurityException e)
    
        txtLat = (TextView) findViewById(R.id.textview1);
        txtLat.setText("Security Exception");

    


@Override
protected void onDestroy() 
    super.onDestroy();
    locationManager.removeUpdates(this);



@Override
public void onLocationChanged(Location location) 
    txtLat = (TextView) findViewById(R.id.textview1);
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
    float dist1=getsignaldistance(location);
    tx=(TextView)findViewById((R.id.textview2));
    tx.setText("Distance for next signal:"+Float.toString(dist1)+"m");
    checksendsms(location);


private void checksendsms(Location location) 
    Location strpoint=new Location("strpoint");
    strpoint.setLatitude(location.getLatitude());
    strpoint.setLongitude(location.getLongitude());
    Location endpoint=new Location("endpoint");
    endpoint.setLatitude(10.813763);
    endpoint.setLongitude(78.644309);
    float dist=strpoint.distanceTo(endpoint);
    tx=(TextView)findViewById((R.id.textview3));
    tx.setText("Distance between points:"+Float.toString(dist)+"m");
    if(dist<=10.0)
    
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phonenumber, null, message, null, null);
        finish();
    


【讨论】:

非常感谢您的帮助!

以上是关于在到达某个位置时在 Android 中发送短信的主要内容,如果未能解决你的问题,请参考以下文章

当用户到达特定位置时向用户发送推送通知 [IOS]

如何临时创建一个没有任何文件位置的文本文件并在运行时在 Spring Boot 中作为响应发送?

Android 连接时在后台发送数据

发送 Facebook 私信时在 iOS 和 Android 中设置“to”

如何解决短信验证码接口被攻击的问题?

当汽车到达特定半径时如何发送推送通知