5

I want to send a simple message and i have <uses-permission android:name="android.permission.SEND_SMS"/> in my manifest, but I always get: java.lang.SecurityException: Sending SMS message: uid 10064 does not have android.permission.SEND_SMS.

I checked this answer, but it still doesn't work.

this is my manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.roa.sendsms" >


<uses-permission android:name="android.permission.SEND_SMS"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

and this is my code:

package com.roa.sendsms;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.telephony.SmsManager;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    Button sendButton =  (Button)findViewById(R.id.sendButton);
    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendSms(phoneNumber, "you get message from roish app!!");
        }
    });
}

private void sendSms(String phoneNumber, String message){
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
}

}

thank to all.

Community
  • 1
  • 1
Codey
  • 460
  • 1
  • 8
  • 23
  • 2
    I guess you are testing it on Android M (6) am I right? – VizGhar Nov 11 '15 at 09:55
  • 1
    what you mean by uses-sdk? He has it specified in `build.gradle` file probably – VizGhar Nov 11 '15 at 09:56
  • 2
    If you are testing on Android M, install app on device and check application permission in settings. Try to turn permission on if its there. If it will work now, follow instructions at http://developer.android.com/training/permissions/requesting.html – VizGhar Nov 11 '15 at 09:58
  • @VizGhar Got it . Your link useful – IntelliJ Amiya Nov 11 '15 at 10:00
  • I run it on the emulator. I will try to install it on my device... – Codey Nov 11 '15 at 10:03
  • in my device it show the premission but not sending the message – Codey Nov 11 '15 at 10:14
  • ok. it so weird, in the emulator the app crashed. but in my device it work. why? – Codey Nov 11 '15 at 10:42
  • Since android Marshmallow release there are many changes in permissions API. For devices with Marshmallow and up, permissions are handled different way. On your device you have probalby earlier version of android – VizGhar Nov 11 '15 at 11:47
  • Thank you very much VizGhar, I had exactly this problem on Android 6, you helped me to solve it ! Thanks again... – Christian Nov 24 '15 at 13:50

5 Answers5

4

Try to use something like this. Not tested, but should work fine. Drop a note when you see some problem here.

This is just to show how permission granting in Android M works. Please extend it by functionalities mentioned on Android tutorial site about permissions.

You will need add ActivityCompat.shouldShowRequestPermissionRationale check to match best practices. I can extend this answer but I think it's not necessary. Just make sure you are granting permissions in runtime (or use targetSdkVersion lower then 23 - this is however not recommended)

private static final int PERMISSION_SEND_SMS = 123;

private void requestSmsPermission() {

    // check permission is given
    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
        // request permission (see result in onRequestPermissionsResult() method)
        ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.SEND_SMS},
            PERMISSION_SEND_SMS);
    } else {
        // permission already granted run sms send
        sendSms(phone, message);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {

            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted
                sendSms(phone, message);
            } else {
                // permission denied
            }
            return;
        }
    }
}

private void sendSms(String phoneNumber, String message){
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
}
VizGhar
  • 3,036
  • 1
  • 25
  • 38
  • thanks guy. right now my code is working. as you can see in my answer here, the problem was in the emulator. but maybe i will try it later. thank a lot – Codey Nov 11 '15 at 13:37
1

i had same problem you need to get runtime permission on setting>app>"your app" >enable sms permission

alireza
  • 11
  • 1
1

If you message is too long using smsManager.sendTextMessage(.. will fail quietly.

You need to use smsManager.sendMultipartTextMessage(...

SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> messageList = smsManager.divideMessage(message.toString());
smsManager.sendMultipartTextMessage(phoneNumber, null, messageList, null, null);
Eire82
  • 21
  • 2
0

You may try this way:

private void sendSms(String phoneNumber, String message) {
   Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse( "sms:" + phoneNumber ) ); 
   intent.putExtra( "sms_body", message ); 
   startActivity(intent);
}
walkmn
  • 2,322
  • 22
  • 29
-1

I tried this in Huawei Android 8, besides adding permission READ_PHONE_STATE in manifest, the phone needs to allow to "access phone ID" to the app. Then it works.