2015-05-08 12 views
7

Итак, я следую за этим Tutorial здесь, установив свое SMS как значение по умолчанию, но по какой-то причине мой код не работает. Я попытался посмотреть это как можно больше, но все указывает на этот же учебник или устарело. Нужен ли мне приемник? Может кто-нибудь объяснить, что я делаю неправильно?android default default default sms app

Кодекс:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    Log.i("MainAcitvity", "On Resume Called"); 
    // Only do these checks/changes on KitKat+, the "mSetDefaultSmsLayout" has its visibility 
    // set to "gone" in the xml layout so it won't show at all on earlier Android versions. 
    final String myPackageName = getPackageName(); 

    if (Utility.hasKitKat()) 
    { 
     if (Utility.isDefaultSmsApp(this)) 
     { 
      // This app is the default, remove the "make this app the default" layout and 
      // enable message sending components. 
      mSetDefaultSmsLayout.setVisibility(View.GONE); 
     } 
     else 
     { 
      Log.i("MainActivity", "Not Default App"); 
      // Not the default, show the "make this app the default" layout and disable 
      // message sending components. 
      mSetDefaultSmsLayout.setVisibility(View.VISIBLE); 

      Button button = (Button) findViewById(R.id.set_default_sms_button); 
      button.setOnClickListener(new OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       {       
        Log.i("MainActivity", "Button Pushed"); 
        //Utility.setDefaultSmsApp(MainActivity.this); 
        Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); 
        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName); 
        startActivity(intent); 
       } 
      }); 
     } 
    } 
} 

Манифест:

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

ответ

14

Для того, чтобы ваше приложение, чтобы иметь право быть выбран в качестве приложения обмена сообщениями по умолчанию (насколько система обеспокоен), вы должны перечислить все компоненты манифеста, как показано в этом сообщении в блоге, действительно ли эти классы компонентов существуют или нет.

<manifest> 
    ... 
    <application> 
     <!-- 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> 

     <!-- 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> 
</manifest> 

Поскольку система только инспектирует манифест приложения, чтобы определить, если он может выступать в качестве приложения обмена сообщений по умолчанию, не всем классов этих компонентов должен существовать для вашего приложения, чтобы показать в списке выбора по умолчанию. Это полезно для обучения и тестирования, но, очевидно, если ваше приложение будет действовать как клиент обмена сообщениями по умолчанию пользователя, он должен полностью реализовать все указанные компоненты.

Если вы намерены выполнять любые задачи, связанные с SMS/MMS, вам также понадобятся соответствующие разрешения. Хотя система, по-видимому, не проверить это при определении подходящих кандидатов приложений по умолчанию, следующие разрешения необходимы для их соответствующих операций:

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

Если вы пропустили SEND_SMS, READ_SMS или WRITE_SMS разрешения при попытке для выполнения данного действия будет выброшено SecurityException. Однако, если вам не хватает разрешения RECEIVE_*, ваше приложение просто не будет доставлено соответствующие трансляции, и может показаться, что при тестировании этих функций ничего не происходит.

+0

М: есть «HeadlessSmsSendService» - это класс обслуживания Android? –

+0

@VineeshTP Да. Любой компонент с элементом '' будет подклассом 'Сервис'. –

+0

@MikeM. если я не сделаю ничего, входящие сообщения никогда не появятся в моем почтовом ящике обычного обычного приложения sms? как будто они просто исчезнут? Поскольку я хочу видеть SMS-сообщения обычно в приложении по умолчанию, но использовать свое приложение, потому что я хочу реализовать шлюз SMS. – BlackDivine