恢复短信时 startActivityForResult 总是 return 0

startActivityForResult always return 0 when restore sms

此代码在 lollypop 版本上正常工作,但是,当我在 Kitkat 上使用它时,当我从对话框中选择 "Yes/No" 选项时,它总是 returns 0。

btnSMSRestore.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
                if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){
                    defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(SMSActivity.this);
                    if (!getPackageName().equals(defaultSmsApp))
                    {
                        Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
                        //startActivity(intent);
                        startActivityForResult(intent, DEF_SMS_REQ);
                    }
                }
                else
                {
                    new RestoreSMS().execute();
                }
    });
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    switch (requestCode)
    {
        case DEF_SMS_REQ:           
            if(resultCode == Activity.RESULT_OK)
            {
                new RestoreSMS().execute();
            }
    }
}

Activity.RESULT_OK value 为 -1 且 onActivityResult 中的 resultCode 在与 kitkat 一起使用时始终为 0。

来自Android documentation:

onActivityResult Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.

RESULT_CANCELED值为0,可能在KitKat上没有设置结果值,返回默认值。

作为 KitKat 的解决方法,您可以尝试在触发 onActivityResult 时检查您的应用是否为默认应用。试试这个代码:

btnSMSRestore.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            if (!isDefaultSmsApp(SMSActivity.this)) {
            {
                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
                startActivityForResult(intent, DEF_SMS_REQ);
            }
        } else {
            new RestoreSMS().execute();
        }
});

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case DEF_SMS_REQ:
            if (Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.KITKAT && isDefaultSmsApp(this) ||
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && resultCode == Activity.RESULT_OK) {
                new RestoreSMS().execute();
            }
            break;
    }
}

@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isDefaultSmsApp(Context context) {
    return context.getPackageName().equals(Telephony.Sms.getDefaultSmsPackage(context));
}