Android实现位置坐标短信发送的代码问题求助
解决Android位置获取与SMS发送的代码问题
我来帮你一步步解决这些代码问题,咱们逐个梳理错误点并修正:
1. 修复onCreate中的语法与权限检查逻辑错误
你原来的权限检查代码括号不匹配,&&的位置也不对,导致出现“意外令牌”错误。正确的权限检查需要把两个权限判断放在同一个if条件里,并且确保括号闭合:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen); // 初始化FusedLocationProviderClient fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE); } else { // 检查权限是否已授予 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE); return; } // 权限已授予,构建位置请求和回调 buildLocationRequest(); buildLocationCallback(); fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper()); } }
注意:这里把权限请求的数组同时包含了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION,确保位置服务能正常工作。
2. 修复location方法的参数未使用问题
你原来的location方法没有用到传入的currentLocation参数,导致IDE提示“从未使用”,而且短信内容也没有包含坐标。我们需要把经纬度拼接到Google Maps链接里:
private void sendLocationSms(String phoneNumber, Location currentLocation) { // 重命名方法让语义更清晰 SmsManager smsManager = SmsManager.getDefault(); // 正确的Google Maps链接格式 String smsBody = "https://maps.google.com/?q=" + currentLocation.getLatitude() + "," + currentLocation.getLongitude(); smsManager.sendTextMessage(phoneNumber, null, smsBody, null, null); }
这里把方法名改成sendLocationSms,让代码可读性更强,同时把经纬度正确拼接到短信内容中。
3. 修复buildLocationCallback中的语法错误
你原来的buildLocationCallback里存在括号不匹配、未调用sendTextMessage的问题,而且循环代码块没有用大括号包裹。我们需要在获取到位置结果后,调用上面的sendLocationSms方法:
private void buildLocationCallback() { locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { // 获取最新的位置(取结果列表的最后一个即可) Location latestLocation = locationResult.getLastLocation(); if (latestLocation != null) { // 替换成你要发送的手机号 sendLocationSms("MY_PHONE_NUMBER", latestLocation); // 如果只需要发送一次位置,可以在这里停止位置更新 fusedLocationProviderClient.removeLocationUpdates(locationCallback); } } }; }
注意:这里用getLastLocation()获取最新的位置,避免循环处理多个位置;同时如果只需要发送一次位置,记得调用removeLocationUpdates停止更新,避免耗电。
4. 修正其他细节问题
- 你原来在onCreate里直接
new Location(String.valueOf(provider))是错误的,这种方式创建的Location对象没有真实的经纬度数据,正确的做法是在LocationCallback的onLocationResult里获取真实的位置。 buildLocationRequest的参数设置是合理的,但如果只是单次获取位置,可以把interval和fastestInterval调大一些,减少耗电。
完整修正后的代码
import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.os.Looper; import android.telephony.SmsManager; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; public class FullscreenActivity extends AppCompatActivity { private static final int REQUEST_CODE = 1000; private FusedLocationProviderClient fusedLocationProviderClient; private LocationRequest locationRequest; private LocationCallback locationCallback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE); } else { checkPermissionsAndStartLocationUpdates(); } } private void checkPermissionsAndStartLocationUpdates() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE); return; } buildLocationRequest(); buildLocationCallback(); fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper()); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_CODE: { if (grantResults.length > 0) { boolean fineLocationGranted = grantResults[0] == PackageManager.PERMISSION_GRANTED; boolean coarseLocationGranted = grantResults[1] == PackageManager.PERMISSION_GRANTED; if (fineLocationGranted || coarseLocationGranted) { // 至少一个位置权限被授予,开始获取位置 checkPermissionsAndStartLocationUpdates(); } else { // 权限被拒绝,可以提示用户开启权限 } } } } } private void sendLocationSms(String phoneNumber, Location currentLocation) { SmsManager smsManager = SmsManager.getDefault(); String smsBody = "https://maps.google.com/?q=" + currentLocation.getLatitude() + "," + currentLocation.getLongitude(); smsManager.sendTextMessage(phoneNumber, null, smsBody, null, null); } private void buildLocationCallback() { locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { Location latestLocation = locationResult.getLastLocation(); if (latestLocation != null) { sendLocationSms("MY_PHONE_NUMBER", latestLocation); // 停止位置更新,避免持续获取 fusedLocationProviderClient.removeLocationUpdates(locationCallback); } } }; } private void buildLocationRequest() { locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(10000); // 10秒间隔,按需调整 locationRequest.setFastestInterval(5000); // 最快5秒间隔 locationRequest.setSmallestDisplacement(10); // 移动10米才更新 } }
最后,别忘了在AndroidManifest.xml中添加必要的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.SEND_SMS" />
内容的提问来源于stack exchange,提问作者markbunting
相关产品推荐
相关产品推荐

