2014-11-19 4 views
4

Я работаю над восстановлением SMS на KITKAT. Ссылаясь на это article, я добавил то, что необходимо для установки моего приложения в качестве приложения по умолчанию для SMS. После добавления всех необходимых вещей в файле манифеста я должен написать следующий код:Android - получить результат из-за изменения диалога SMS по умолчанию

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
{ 
    mDefaultSmsApp = Telephony.Sms.getDefaultSmsPackage(mContext); 
    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); 
    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, mContext.getPackageName()); 
    mContext.startActivity(intent); 
} 

enter image description here

Приведенный выше код показывает этот диалог, но я не могу получить результат от этой деятельности/диалоге либо пользователь нажал на Да или Нет, потому что я хочу добавить слушателя или получить код, который должен представлять, что пользователь нажал на эти кнопки. Спасибо.

+0

Я не думаю, что это возможно, но почему вы это делаете? В сообщении Afaik SMS и Hangouts используется поставщик контента. Это зависит от пользователя, где он хочет иметь сообщения. –

+0

@Williams Я делаю это, потому что в Android Kitkat и выше единственное приложение SMS по умолчанию может писать сообщения. Я верну свое приложение в качестве приложения по умолчанию, прежде чем восстанавливать сообщения и снова установить предыдущее приложение по умолчанию после завершения восстановления. –

+0

Вы делаете это из Activity? –

ответ

9

Один из способов сделать это, чтобы сжечь намерение с startActivityForResult(), а затем проверить resultCode в методе onActivityResult(). Обратите внимание, что я изменил код в примере для запуска в Контексте активности.

private static final int DEF_SMS_REQ = 0; 
private String mDefaultSmsApp; 

... 

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    { 
     mDefaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this); 

     if (!getPackageName().equals(mDefaultSmsApp)) 
     { 
      Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); 
      intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName()); 
      startActivityForResult(intent, DEF_SMS_REQ); 
     } 
    }  

... 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    switch (requestCode) 
    { 
     case DEF_SMS_REQ:   
      boolean isDefault = resultCode == Activity.RESULT_OK; 
      ... 
    } 
} 

Как уже упоминалось в комментарии ниже, по-видимому, проверка кода результата не 100% надежным. Более безопасная проверка - просто сравнить имя пакета вашего приложения с текущим значением по умолчанию в onActivityResult(). Нет необходимости проверять код результата вообще, как показывает ответ, связанный в комментарии.

String currentDefault = Sms.getDefaultSmsPackage(this); 
boolean isDefault = getPackageName().equals(currentDefault); 
+0

Над кодом отлично работает на Lollipop. Но, не работая над Киткатом. В onActivityResult он возвращает 0 для resultCode при выборе «yes». Пожалуйста, помогите мне. – SANAT

+0

Моя проблема решена, если у кого-то такая же проблема, то посмотрите ответ на этот вопрос http://stackoverflow.com/questions/29873599/startactivityforresult-always-return-0-when-restore-sms/29876919?noredirect=1#comment47905721_29876919 – SANAT

0

, как вы можете реагировать на «да» нажатием кнопки:

private String mDefSmsPackage; 

@Override 
public void onCreate(@Nullable Bundle state) { 
    //... 
    mDefSmsPackage = Telephony.Sms.getDefaultSmsPackage(getActivity()) 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    String newDefSmsPkg = Telephony.Sms.getDefaultSmsPackage(getActivity()); 
    if (!TextUtils.equals(mDefSmsPackage, newDefSmsPkg)) { 
     mDefSmsPackage = newDefSmsPkg; 

     //ON DEF SMS APP CAHNGE... 

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