Albentrix
Albentrix

Reputation: 428

Android - Try to send fake sms to myself without mobile network usage

I'm trying to send message to my phone with this app, without using network usage, but my code doesn't work. I followed some tutorial, check android dev and I haven't found anything (in my logcat I don't have error). Could you help me to find out my problem.

My information about compilation, compiler and phone:

Manifest:

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

Function of my main activity:

Context context;
String sender;
String body;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Get current context
    context = this;

    //App started
    Toast.makeText(context, "Started", Toast.LENGTH_LONG).show();

    CheckApp();
}

private void CheckApp() {

    sender = "1234";
    body = "Android sms body";

    //Get my package name
    final String myPackageName = getPackageName();

    //Check if my app is the default sms app
    if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {

        //Get default sms app
        String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);

        //Change the default sms app to my app
        Intent intent = new Intent( Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
        startActivity(intent);

        //Write the sms
        WriteSms(body, sender);

        //Change my sms app to the last default sms app
        Intent intent2 = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
        intent2.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);
        startActivity(intent2);
    }
    else{

        //Write the sms
        WriteSms(body, sender);
    }
}

//Write the sms
private void WriteSms(String message, String phoneNumber) {

    //Put content values
    ContentValues values = new ContentValues();
    values.put(Telephony.Sms.ADDRESS, phoneNumber);
    values.put(Telephony.Sms.DATE, System.currentTimeMillis());
    values.put(Telephony.Sms.BODY, message);

    //Insert the message
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        context.getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
    }
    else {
        context.getContentResolver().insert(Uri.parse("content://sms/sent"), values);
    }
}

Well, this is what i wanna do but with my own app and not with the app Fake Text Message that downloaded to the play store.

Make the fake message and what should i see on my default sms app:

Upvotes: 17

Views: 17187

Answers (1)

Albentrix
Albentrix

Reputation: 428

With the help from Mike M. I finally finished my program. So, this is the code that you must add to your app to be able to send sms without using network:

Manifest:

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <!-- BroadcastReceiver that listens for incoming SMS messages -->
    <receiver android:name=".SmsReceiver"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_DELIVER" />
        </intent-filter>
    </receiver>

    <!-- BroadcastReceiver that listens for incoming MMS messages -->
    <receiver android:name=".MmsReceiver"
        android:permission="android.permission.BROADCAST_WAP_PUSH">
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
    </receiver>

    <!-- My activity -->
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <!-- Activity that allows the user to send new SMS/MMS messages -->
    <activity android:name=".ComposeSmsActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </activity>

    <!-- Service that delivers messages from the phone "quick response" -->
    <service android:name=".HeadlessSmsSendService"
        android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </service>

</application>

Main Activity:

Context context;
Button button;
String sender,body,defaultSmsApp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Get current context
    context = this;

    //Set composant
    button = (Button) findViewById(R.id.button);

    //Get default sms app
    defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);

    //Set the number and the body for the sms
    sender = "0042";
    body = "Android fake message";

    //Button to write to the default sms app
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            //Get the package name and check if my app is not the default sms app
            final String myPackageName = getPackageName();
            if (!Telephony.Sms.getDefaultSmsPackage(context).equals(myPackageName)) {

                //Change the default sms app to my app
                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
                startActivityForResult(intent, 1);
            }
        }
    });
}

//Write to the default sms app
private void WriteSms(String message, String phoneNumber) {

    //Put content values
    ContentValues values = new ContentValues();
    values.put(Telephony.Sms.ADDRESS, phoneNumber);
    values.put(Telephony.Sms.DATE, System.currentTimeMillis());
    values.put(Telephony.Sms.BODY, message);

    //Insert the message
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        context.getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
    }
    else {
        context.getContentResolver().insert(Uri.parse("content://sms/sent"), values);
    }

    //Change my sms app to the last default sms
    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);
    context.startActivity(intent);
}

//Get result from default sms dialog pops up
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {

            final String myPackageName = getPackageName();
            if (Telephony.Sms.getDefaultSmsPackage(context).equals(myPackageName)) {

                //Write to the default sms app
                WriteSms(body, sender);
            }
        }
    }
}

As a result of adding things in your manifest you must add 4 classes: SmsReceiver, MmsReceiver, ComposeSmsActivity and HeadlessSmsSendService. You can let them empty as shown below.

SmsReceiver:

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

MmsReceiver:

public class MmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

ComposeSmsActivity:

public class ComposeSmsActivity extends ActionBarActivity {

}

HeadlessSmsSendService:

public class HeadlessSmsSendService extends IntentService {
    public HeadlessSmsSendService() {
        super(HeadlessSmsSendService.class.getName());
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

If you need more help to understand this program have a look there:

Youtube - DevBytes: Android 4.4 SMS APIs

Android developers - Getting Your SMS Apps Ready for KitKat

Possiblemobile - KitKat SMS and MMS supports

Upvotes: 13

Related Questions