2015-02-17 2 views
13

Я пытаюсь отправить сообщение на свой телефон с этим приложением, не используя сетевое использование, но мой код не работает. Я следил за некоторым учебным пособием, проверяю android dev, и я ничего не нашел (в моем logcat у меня нет ошибки). Не могли бы вы помочь мне выяснить мою проблему.Android - попробуйте отправить поддельные sms мне без использования мобильной сети

Моя информация о компиляции, компилятор и телефон:

  • Android Studio 1.0.1

  • API 19 Android 4.4.4 (KitKat)

  • Сложение 19

  • Номер телефона Android 4.4.4

Manifest:

<uses-permission android:name="android.permission.WRITE_SMS"/> 
<uses-permission android:name="android.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); 
    } 
} 

Ну, это то, что я хочу сделать, но с моим собственным приложением, а не с приложением Fake Text Message, что загружаемый в игре магазин.

Сделать ложное сообщение, и что я должен увидеть на мое приложение смс по умолчанию:

+1

Ваше приложение не может быть установлен как по умолчанию SMS приложение на нет, если, по крайней мере, его манифест содержит все, что показано в примере здесь: [Получение ваших SMS-приложений для KitKat] (http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html ? т = 1). Кроме того, когда активируется «ACTION_CHANGE_DEFAULT» Intent, появляется диалоговое окно подтверждения, поэтому я не думаю, что ваш метод будет работать так, как вы ожидаете. –

+1

В качестве примечания, если вы просто играете на своем собственном устройстве под управлением 4.4.4, вы можете проверить [мой ответ здесь] (http://stackoverflow.com/a/27709655/2850651) для возможного обходного пути. –

+0

Я прочитал пример, показанный в сообщении «Получение ваших SMS-приложений для KitKat». Все лишние вещи, которые я не добавляю к моему манифесту, похоже, используются для управления смс, mms (возвращенными, отправленными) в сеть (не то, что я хочу делать в своем приложении). В моем приложении я просто хочу вставить смс, например, приложение [Fake Text Message] (https://play.google.com/store/apps/details?id=com.neurondigital.FakeTextMessage&hl=fr). Кстати, я хочу использовать мое приложение больше, чем свой телефон. – Albentrix

ответ

9

С помощью Майка М. Я, наконец, закончил свою программу. Таким образом, это код, который вы должны добавить к вашему приложению, чтобы иметь возможность отправить смс без использования сети:

манифеста:

<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, MmsReceiver, ComposeSmsActivity и HeadlessSmsSendService. Вы можете оставить их пустыми, как показано ниже.

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

Если вам нужна дополнительная помощь, чтобы понять эту программу, посмотрите там:

Youtube - DevBytes: Android 4.4 SMS APIs

Android developers - Getting Your SMS Apps Ready for KitKat

Possiblemobile - KitKat SMS and MMS supports

+0

Непослушный озорной! – 130nk3r5

+0

С самого начала разработки Android - я нашел, что это работает (SMS можно найти в папке «Входящие» после нажатия кнопки). Но он работает без уведомлений о новых SMS-сообщениях - и каждый раз, когда мы нажимаем кнопку, мы должны «подтвердить», что мы будем использовать это приложение как приложение defaul SMS. Так что, возможно, не подходит для использования в тех случаях, когда мы хотели бы «испытать обычный жизненный цикл SMS» (с уведомлениями и без постоянных подтверждений диалога и т. Д.). – nettutvikler

+0

@Albentrix Cant мы устанавливаем значения [Read] (https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html#READ) и [Видно] (https://developer.android. com/reference/android/provider/Telephony.TextBasedSmsColumns.html # SEEN), поскольку в соответствии с документацией, которую, как видно, видно, используется для установки уведомления для нового сообщения. –

Смежные вопросы