当前位置:首页 > 行业动态 > 正文

关于Android系统调用短信接口的疑问与挑战

在Android中调用短信接口,可使用 SmsManager类。先获取其实例,然后通过 sendTextMessage方法发送短信,需提供接收者号码、短信内容等参数。

在Android开发中,调用短信接口发送短信是一项常见的功能需求,以下是详细的实现步骤、代码示例以及相关注意事项:

整体流程

1、创建Android项目:使用Android Studio创建一个新的Android项目,并选择合适的模板(如Empty Activity)。

2、添加必要的权限:在AndroidManifest.xml文件中声明发送短信的权限。

3、设计用户界面:在activity_main.xml中设计一个包含电话号码输入框、短信内容输入框和发送按钮的用户界面。

4、编写发送短信的代码:在MainActivity.java或MainActivity.kt中实现发送短信的逻辑。

5、测试功能:运行应用并测试发送短信的功能。

关于Android系统调用短信接口的疑问与挑战

详细步骤及代码示例

创建Android项目

使用Android Studio创建一个新的Android项目,并命名为“SMSApp”或其他你喜欢的名称,选择Empty Activity模板作为起始点。

添加必要的权限

在AndroidManifest.xml文件中添加以下权限声明,以允许应用发送短信:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smsapp">
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <application
        ...
    </application>
</manifest>

设计用户界面

在res/layout/activity_main.xml文件中设计一个简单的用户界面,包含一个EditText用于输入电话号码,另一个EditText用于输入短信内容,以及一个Button用于发送短信:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">
    <EditText
        android:id="@+id/phoneNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入电话号码" />
    <EditText
        android:id="@+id/message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入短信内容"
        android:minLines="4"
        android:gravity="top" />
    <Button
        android:id="@+id/sendButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送短信" />
</LinearLayout>

编写发送短信的代码

在MainActivity.java或MainActivity.kt中编写发送短信的逻辑,需要在类中导入必要的库:

关于Android系统调用短信接口的疑问与挑战

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

在onCreate方法中初始化UI组件,并为发送按钮设置点击事件监听器:

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_SEND_SMS = 1;
    private EditText phoneNumber;
    private EditText message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        phoneNumber = findViewById(R.id.phoneNumber);
        message = findViewById(R.id.message);
        Button sendButton = findViewById(R.id.sendButton);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendSms();
            }
        });
    }
    private void sendSms() {
        String phone = phoneNumber.getText().toString();
        String msg = message.getText().toString();
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS);
        } else {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phone, null, msg, null, null);
            Toast.makeText(getApplicationContext(), "短信已发送", Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_SEND_SMS) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                sendSms();
            } else {
                Toast.makeText(getApplicationContext(), "发送短信权限被拒绝", Toast.LENGTH_LONG).show();
            }
        }
    }
}

测试功能

运行应用,输入电话号码和短信内容,然后点击发送按钮,如果一切正常,应用将尝试发送短信,并在发送成功后显示一条消息,由于Android 6.0及以上版本的动态权限机制,应用可能需要请求发送短信的权限,如果用户拒绝了该权限请求,应用将无法发送短信。

相关问题与解答

问题1:如何在Android中调用系统发送短信的界面?

解答:可以通过以下方式调起系统发短信功能:

关于Android系统调用短信接口的疑问与挑战

public void doSendSMSTo(String phoneNumber, String message) {
    if (PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)) {
        Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + phoneNumber));
        intent.putExtra("sms_body", message);
        startActivity(intent);
    }
}

这种方法会调起系统的短信应用,并将电话号码和短信内容填充到短信编辑界面中,用户确认后即可发送,但请注意,这种方式不会直接发送短信,而是让用户手动完成发送操作。

问题2:如何处理短信发送状态和接收状态的监听?

解答:为了处理短信发送状态和接收状态的监听,可以使用PendingIntent来设置广播接收器,以下是一个简单的示例:

// 处理返回的发送状态
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
context.registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context _context, Intent _intent) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                break;
        }
    }
}, new IntentFilter(SENT_SMS_ACTION));
// 处理返回的接收状态
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0, deliverIntent, 0);
context.registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context _context, Intent _intent) {
        Toast.makeText(context, "收信人已经成功接收", Toast.LENGTH_SHORT).show();
    }
}, new IntentFilter(DELIVERED_SMS_ACTION));