Android Studio中短信发送位置按钮失效问题求助
问题修复方案
核心问题分析
- 权限检查导致按钮初始化被跳过:
onCreate中定位权限未授予时直接return,后续按钮初始化和点击事件绑定代码未执行,按钮完全无响应。 - 短信发送逻辑缺失:
sendSMSMessage仅在权限未授予时请求权限,权限已通过时没有执行实际发送操作。 - 定位坐标赋值错误:误将海拔(
Altitude)当作纬度,正确纬度应通过getLatitude()获取。 - 权限请求结果未完整处理:统一请求了定位和短信权限,但
onRequestPermissionsResult只处理了短信权限的请求码,定位权限授予后无法启动定位更新。
修复后的完整代码
private LocationManager locationManager; private LocationListener locationListener; String[] appPermissions = { android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.SEND_SMS }; private static final int PERMISSIONS_REQUEST_CODE = 123; double latitude, longitude; // 修正变量名,明确坐标含义 Button sendBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 优先初始化按钮和点击事件,确保按钮始终可响应 sendBtn = findViewById(R.id.btnSendSMS); sendBtn.setOnClickListener(view -> sendSMSMessage()); // 请求必要权限 if (checkAndRequestPermissons()) { // 权限已授予,直接启动定位更新 startLocationUpdates(); } // 初始化定位监听器 locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 修正坐标赋值,正确获取纬度和经度 latitude = location.getLatitude(); longitude = location.getLongitude(); Log.d("Location", "纬度:" + latitude + ",经度:" + longitude); } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} }; } protected void sendSMSMessage() { // 检查短信权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_REQUEST_CODE); return; } // 权限已授予,执行短信发送逻辑 if (latitude == 0 && longitude == 0) { Toast.makeText(getApplicationContext(), "尚未获取到位置信息", Toast.LENGTH_LONG).show(); return; } SmsManager smsManager = SmsManager.getDefault(); String locationLink = "Je suis en danger, voici ma localisation : https://www.google.com/maps/search/?api=1&query=" + latitude + "," + longitude; smsManager.sendTextMessage("+212xxxxx", null, locationLink, null, null); Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSIONS_REQUEST_CODE) { boolean allGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { // 所有权限授予,启动定位更新 startLocationUpdates(); } else { Toast.makeText(getApplicationContext(), "需要授予必要权限才能使用功能", Toast.LENGTH_LONG).show(); } } } private boolean checkAndRequestPermissons() { List<String> listPermissionsNeeded = new ArrayList<>(); for (String perm : appPermissions) { if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(perm); } } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[0]), PERMISSIONS_REQUEST_CODE); return false; } return true; } // 抽离定位更新逻辑,简化代码复用 private void startLocationUpdates() { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); }
关键修复点说明
- 按钮初始化提前:将按钮绑定逻辑移到权限检查前,确保按钮始终能响应点击。
- 补充发送逻辑:权限通过后直接执行短信发送,增加位置未获取的提示。
- 修正坐标错误:替换
getAltitude()为getLatitude(),生成有效地图链接。 - 统一权限处理:用单个请求码处理所有权限,授予后自动启动定位。
- 抽离定位逻辑:将启动定位的代码单独封装,提升代码可读性和复用性。
内容的提问来源于stack exchange,提问作者youna kim
相关产品推荐
相关产品推荐

