Android не может отправить текст на другое устройство - PullRequest
0 голосов
/ 03 октября 2018

Я проверил уже опубликованные решения на наличие ошибки, которая посоветовала мне поставить проверку прав доступа.

Использование 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();
            }
        }
    }
}

Теперь все отлично работает !!

1 Ответ

0 голосов
/ 03 октября 2018

В настоящее время вашему приложению не предоставлено разрешение SMS, поэтому оно запускает // Permission is not granted, что представляет собой довольно простую строку кода.Вы можете запросить разрешение с помощью API ActivityCompat с

ActivityCompat.requestPermissions(
    this,
    new String[]{Manifest.permission.SEND_SMS},
    1
);

. Вы можете перехватить это событие с помощью onRequestPermissionsResult , а затем либо продолжить как обычно, если они предоставили вам доступ, либо показать Toastили что-то, если им было отказано в доступе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...