Я проверил уже опубликованные решения на наличие ошибки, которая посоветовала мне поставить проверку прав доступа.
Использование targetSdkVersion 26 - и Android Studio 3.2
Я установил (из учебника YouTube)) смс в моем приложении.У меня есть два приложения на двух разных устройствах.Я хочу, чтобы пользователи из приложения A могли общаться с пользователями из приложения B. Я поместил один и тот же код в оба приложения из этого урока
Отправка и получение сообщений или SMS - учебник по Android Studio
Сначала, когда я запускаю приложение, я получил ошибку:
Sending SMS Message: uid 10085 does not have android.permission.SEND_SMS
Итак, я добавил проверку прав в кнопке onclick ()
Теперь, когда я запускаю приложения, при попытке отправки ничего не происходит.
Манифест
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" android:protectionLevel="signature" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Activities.RiderActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MessageReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
SMS_Activity
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// display the message in the textView
TextView inTxt = (TextView) findViewById(R.id.textMsg);
inTxt.setText(intent.getExtras().getString("message"));
}
};
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String myMsg = tvMessage.getText().toString();
String theNumber = tvNumber.getText().toString();
if (ContextCompat.checkSelfPermission(SMS_Activity.this, Manifest.permission.SEND_SMS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
} else {
sendMsg(theNumber, myMsg);
}
}
});
protected void sendMsg(String theNumber, String myMsg) {
String SENT = "Message Sent";
String DELIVERED = "Message Delivered";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new
Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(theNumber, null, myMsg, sentPI, null);
}
Редактировать
Добавлен onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_SEND_SMS: {
if (permissions[0].equalsIgnoreCase
(Manifest.permission.SEND_SMS)
&& grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// Permission was granted.
} else {
// Permission denied. Stop the app.
Log.d(TAG, getString(R.string.failure_permission));
Toast.makeText(this,
getString(R.string.failure_permission),
Toast.LENGTH_SHORT).show();
}
}
}
}
Обновлен btnSend.setOnClickListener:
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String myMsg = tvMessage.getText().toString();
String theNumber = tvNumber.getText().toString();
if (ContextCompat.checkSelfPermission(SMS_Activity.this, Manifest.permission.SEND_SMS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
ActivityCompat.requestPermissions(SMS_Activity.this,
new String[]{Manifest.permission.SEND_SMS}, 1);
sendMsg(theNumber, myMsg);
}
}
});
Редактировать #2
В соответствии с рекомендациями я следовал этому руководству:
Приложения для Android - Телефонные звонки и SMS
, сообщая мне эту ошибку:
java.lang.IllegalStateException: Could not execute method for android:onClick
Caused by: java.lang.SecurityException: Neither user 10085 nor current process has android.permission.READ_PHONE_STATE.
Затем я внес эти изменения:
AndroidManifest - добавлено:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
SMSActivity - добавлено:
private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 2;
... checkforPermissions () //работает наСоздайте и перед smsManager
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.SEND_SMS) !=
PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, getString(R.string.permission_not_granted));
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.READ_PHONE_STATE) !=
PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, getString(R.string.permission_not_granted));
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.SEND_SMS},
MY_PERMISSIONS_REQUEST_SEND_SMS);
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
}
} else {
// Permission already granted. Enable the SMS button.
enableSmsButton();
}
... onRequestPermissionsResult ()
// Check if permission is granted or not for the request.
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_SEND_SMS: {
if (permissions[0].equalsIgnoreCase
(Manifest.permission.SEND_SMS)
&& grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// Permission was granted. Enable sms button.
enableSmsButton();
} else {
// Permission denied.
Log.d(TAG, getString(R.string.failure_permission));
Toast.makeText(this,
getString(R.string.failure_permission),
Toast.LENGTH_LONG).show();
// Disable the sms button.
disableSmsButton();
}
}
break;
case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
if (permissions[0].equalsIgnoreCase
(Manifest.permission.READ_PHONE_STATE)
&& grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
// Permission was granted. Enable sms button.
enableSmsButton();
} else {
// Permission denied.
Log.d(TAG, getString(R.string.failure_permission));
Toast.makeText(this,
getString(R.string.failure_permission),
Toast.LENGTH_LONG).show();
// Disable the sms button.
disableSmsButton();
}
}
break;
default:
break;
}
Теперь, когда я запускаю приложения, я получаю ту же ошибку, что и выше.
РЕШЕНИЕ РЕШЕНО
SMSACTIVITY
private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
private boolean checkAndRequestPermissions() {
int permissionSendSms = ContextCompat.checkSelfPermission(this,
Manifest.permission.SEND_SMS);
int permissionReceiveSms = ContextCompat.checkSelfPermission(this,
Manifest.permission.RECEIVE_SMS);
int permissionReadPhoneState = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_PHONE_STATE);
List<String> listPermissionsNeeded = new ArrayList<>();
if (permissionSendSms != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.SEND_SMS);
}
if (permissionReceiveSms != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.RECEIVE_SMS);
}
if (permissionReadPhoneState != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new
String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode) {
case REQUEST_ID_MULTIPLE_PERMISSIONS: {
// Check if permission is granted or not for the request.
if (grantResults.length == 0 || grantResults == null) {
/*If result is null*/
disableSmsButton();
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
/*If We accept permission*/
if (getIntent() != null) {
phone_no = getIntent().getStringExtra("phone");
Log.e(TAG, "phoneNo = " + phone_no);
}
enableSmsButton();
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
/*If We Decline permission*/
disableSmsButton();
}
}
}
}
Теперь все отлично работает !!