我已经有一个活动,在我的应用程序发送一条短信,所以我认为这将很容易复制一些代码到另一个活动,但没有!我试图在MainActivity上放置两个按钮来发送预先写好的短信.完整的MainActivity.java是:
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
private int MY_PERMISSIONS_REQUEST_SMS_SEND = 20;
Button button_8;
Button button_9;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkPermission();
}
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
button_8 = findViewById(R.id.availability_8);
button_8.setOnClickListener(view -> sendSMS8());
button_9 = findViewById(R.id.availability_9);
button_9.setOnClickListener(view -> sendSMS9());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_most_recent_tasking:
Intent intent1 = new Intent(this, ShoutActivity.class);
startActivity(intent1);
break;
case R.id.action_settings:
Intent intent2 = new Intent(this, SettingsActivity.class);
startActivity(intent2);
break;
case R.id.action_about:
Intent intent3 = new Intent(this, AboutActivity.class);
startActivity(intent3);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
protected void sendSMS8() {
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(getString(R.string.at_number), null, "8", null, null);
Toast.makeText(getApplicationContext(), R.string.a_sent,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.a_failed,
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
protected void sendSMS9() {
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(getString(R.string.at_number), null, "9", null, null);
Toast.makeText(getApplicationContext(), R.string.a_sent,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.a_failed,
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void checkPermission() {
if ((ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED)) {
requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
}
if ((ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)) {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SMS_SEND);
}
}
}AndroidManifest文件包括
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />和
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/Theme.CgPager.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>我只是不明白为什么这不管用。(每次我运行它,吐司报告“可用性未能发送”ie string.a_failed。
作为比较,此代码正在进行另一项活动:
protected void sendSMS1() {
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(getString(R.string.at_number), null, "1", null, null);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean partner_text = sharedPreferences.getBoolean("partner", false);
if(partner_text){
String text_message = sharedPreferences.getString("partner_textmessage", "");
String partner_telno = sharedPreferences.getString("partner_phone", "");
smsManager.sendTextMessage(partner_telno, null, text_message, null, null);
}
Intent intent = getIntent();
String shoutContent = intent.getStringExtra(ReceiveAlertActivity.EXTRA_MESSAGE);
Intent secondintent = new Intent(this, ShoutActivity.class);
secondintent.putExtra(MESSAGE, shoutContent);
startActivity(secondintent);
Toast.makeText(getApplicationContext(), R.string.r_sent,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.r_failed,
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}发布于 2021-02-20 03:07:27
更新
android.Manifest.permission.RECEIVE_SMS权限,而不是发送SMS消息的权限。只有在第二次打开文件时才能获得The android.Manifest.permission.SEND_SMS permission。解决方案是添加请求权限结果的回调方法(onRequestPermissionsResult)。只有在多次执行回调方法之后才能应用下一个权限。
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)方法为这个问题提供了一个简单的解决方案。a.在Activity.中获得许可

b.

将要动态获取的权限添加到AndroidManifest.xml文件中。

b.在Activity中批量获取权限:

c.在获得onRequestPermissionsResult方法中的权限后执行处理。

例如,如果您没有发送短消息的权限,则在调用发送短消息的代码时将生成以下日志:

吐司味精可改为""+e.getMessage()

错误消息:



因此,建议您查看日志,找出发送短信失败的原因.
https://stackoverflow.com/questions/66286453
复制相似问题