You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:05:24