恢复短信时startActivityForResult总是返回0短信、startActivityForResult

2023-09-07 00:26:41 作者:只道别

这code棒棒糖上的版本正常工作,但是,当我使用它的奇巧,当我选择是/否对话框,从选项总是返回0。

This code working properly on lollypop version, But, when i use it on Kitkat, it always returns 0 when i choose "Yes/No" option from dialog.

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值为-1,而在结果的onActivityResult code始终为0时奇巧使用。

Activity.RESULT_OK value is -1 and resultCode in onActivityResult is always 0 when use with kitkat.

推荐答案

从Android 文档:

的onActivityResult 当你的活动启动退出,给你请求code你,结果code就开始叫  返回,并从它的任何附加数据。结果code会  RESULT_CANCELED如果活动明确地返回,没  返回任何结果,或者它的操作过程中坠毁。

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,大概奇巧未设置的结果值,则返回默认值。

RESULT_CANCELED value is 0, probably on KitKat is not set a result value and the default one is returned.

由于在奇巧的解决方法,你可以尝试检查,如果你的应用程序是默认的时的onActivityResult被激发。试试这个code:

As workaround on KitKat, you can try to check if your app is the default one when onActivityResult is fired. Try this code:

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