用户更改位置设置后刷新活动

时间:2015-04-08 07:47:06

标签: android onactivityresult

用户流程:点击一个按钮,重定向到MapActivity,其中显示了Google地图。给出一个位置,有一个按钮用于使用当前位置到达给定位置的路线。关闭位置服务后,系统会提示用户将其打开。

private void goToLocationSettings(){
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS );
    startActivityForResult(intent, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
        switch (requestCode) {
            case 1: Log.e("test", "onActivityResult");
                break;
        }
    }
}

当用户返回功能时应该能够完成。但该程序再次打开设置。永远不会显示日志。

如果我在设备上打开位置服务后稍等一下,我就没有问题打开它,但是日志消息仍未显示。

我不知道我做错了什么。

2 个答案:

答案 0 :(得分:7)

您正在检查错误的resultCode,以避免混淆使用常量Activity#RESULT_OKActivity#RESULT_CANCELED。如果查看文档,则可以看到RESULT_OK的int值为-1。

在为结果启动位置设置活动的情况下,resultCode将始终为0,因为用户使用后退按钮退出设置活动,因此系统看起来他已取消请求。

static final int LOCATION_SETTINGS_REQUEST = 1;

 protected void onActivityResult(int requestCode, int resultCode,
         Intent data) {
     if (requestCode == LOCATION_SETTINGS_REQUEST) {
         // user is back from location settings - check if location services are now enabled
         checkGPS();
     }
 }

答案 1 :(得分:0)

没有结果意图的对话框可能像这样,我们需要允许用户导航和检查位置服务

接受

在为结果启动“位置设置活动”时,由于用户使用“后退”按钮退出“设置活动”,因此resultCode始终为0,因此对于系统来说,他看起来像是取消了请求。

代码类似于此处,允许dilog导航到设置页面。

public void showLocationAlert() {
    if (!ismctLocationEnabled(this)) {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(ContentTransferBaseActivity.this);
        alertDialog.setTitle(R.string.mct_enable_Location_title);
        alertDialog.setMessage(R.string.mct_enable_location_message);
        alertDialog.setCancelable(true);

        alertDialog.setPositiveButton(R.string.mct_button_Enable,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(intent);
                    }
                });

        alertDialog.setNegativeButton(R.string.mct_button_Dismiss,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        if(!ismctLocationEnabled(this)) {
            alertDialog.show();
        }else
        {
            AlertDialog dialog=alertDialog.create();
            dialog.dismiss();
        }

    }
}

public static boolean ismctLocationEnabled(Context context) {
    int locationMode = 0;
    String locationProviders;

    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {

        try {
            locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        return locationMode != Settings.Secure.LOCATION_MODE_OFF;

    } else {
        locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        return !TextUtils.isEmpty(locationProviders);
    }
}