有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android试图在不使用移动网络的情况下向自己发送虚假短信

我正在尝试使用此应用程序向手机发送消息,而不使用网络使用,但我的代码不起作用。我遵循了一些教程,检查了安卓开发,但我没有发现任何东西(在我的logcat中,我没有错误)。你能帮我找出我的问题吗

我关于编译、编译器和电话的信息:

  • Android Studio 1.0.1

  • API 19安卓4.4.4(kitkat)

  • 建造19

  • Android手机版本4.4.4

舱单:

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

我的主要活动的功能:

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);
    }
}

嗯,这就是我想做的,但是用我自己的应用程序,而不是下载到play store的应用程序Fake Text Message

生成假消息,我应该在默认短信应用程序上看到什么:


共 (1) 个答案

  1. # 1 楼答案

    在迈克·M.的帮助下,我终于完成了我的程序。因此,这是您必须添加到应用程序中的代码,以便在不使用网络的情况下发送短信:

    清单:

    <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>
    

    主要活动:

    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);
                }
            }
        }
    }
    

    作为在清单中添加内容的结果,您必须添加4个类:SmsReceiver、mmsreiver、composemsactivity和headlessmssendservice。您可以按如下所示将其清空

    SMS接收器:

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

    彩信接收器:

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

    复合活动:

    public class ComposeSmsActivity extends ActionBarActivity {
    
    }
    

    无头服务:

    public class HeadlessSmsSendService extends IntentService {
        public HeadlessSmsSendService() {
            super(HeadlessSmsSendService.class.getName());
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }
    

    如果你需要更多的帮助来理解这个程序,请查看:

    Youtube - DevBytes: Android 4.4 SMS APIs

    Android developers - Getting Your SMS Apps Ready for KitKat

    Possiblemobile - KitKat SMS and MMS supports