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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:54:10