【问题标题】:Weird sharedPreference issue with my Android app我的 Android 应用出现奇怪的 sharedPreference 问题
【发布时间】:2018-12-19 19:53:42
【问题描述】:

问题是设置为 SharedPreferences 的默认值正在改变,具体取决于我是从 Google Play 商店安装应用程序还是直接安装 apk(或从 Play 商店安装后清除应用程序的存储)。

从 Play 商店安装我的布尔值为 false。

清除存储并再次运行,我的布尔值为真。

private void setShowStoragePermission(boolean permission){
    SharedPreferences sharedPreferences  = getSharedPreferences("storagePermission", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("permission", permission).apply();
}

private boolean getShowStoragePermission(){
    SharedPreferences sharedPreferences  = getSharedPreferences("storagePermission", MODE_PRIVATE);
    return sharedPreferences.getBoolean("permission", true);
}

在第一次干净运行时,没有保存 SharedPreferences 所以返回的值是 getShowStoragePermission() 返回真。但是,从 Play 商店安装时,我在最初几秒钟内看到了 toast 的错误(“savedPermission: false”);

您可以在应用的测试版上亲自查看: Link to app on Play store //

我正在 Android P DP4 上测试该应用。这个问题有什么解决办法吗?

MainActivity 中的代码:

if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        setToast("savedPermission: " + getShowStoragePermission(), Toast.LENGTH_LONG);
        //on first run from Google Play store @getShowStoragePermission returns false - need to return true
        if(getShowStoragePermission()) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
        } else {
            makeBingWallRequest(false);
        }
    }else{
        //storage permission granted manually from app settings or from dialog request
        createImageDir();
        makeBingWallRequest(true);
    }

SharedPreferences 的设置位置:

    private void makeBingWallRequest(boolean storagePermission){
    if(getDeviceInternetStatus(context) == null && getBingWallDay() == 0){
        bingImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.bearcats));
        return;
    }
    if(!storagePermission){
       new BingWallpaper(MainActivity.this).execute(false);
    }else {
        Calendar now = Calendar.getInstance(TimeZone.getDefault());
        int day = now.get(Calendar.DAY_OF_MONTH);

        //on first run
        setToast("savedBingWallDay: " + getBingWallDay(), Toast.LENGTH_LONG);
        if(getBingWallDay() == FIRST_RUN_BING_IMAGE){
            saveBingWallDay();
            new BingWallpaper(MainActivity.this).execute(true);
            //every other run
        }else if (day != getBingWallDay()) {
           //if current time is past 3AM then make new request
            int hourIn24 = now.get(Calendar.HOUR_OF_DAY);
            if(hourIn24 >= BING_IMAGE_RESET_HOUR_IN_24){
                saveBingWallDay();
                new BingWallpaper(MainActivity.this).execute(true);
            }else loadBitmap();
        } else loadBitmap();
    }
}

【问题讨论】:

  • 您能否发布从您的活动/片段中调用这两个函数的代码。
  • 您还可以检查不同版本的不同设备吗?这将有助于我们进行更多调查。
  • 我更新了帖子,在我的活动中调用了这两个函数。即将在另一台设备上进行测试。

标签: android android-studio sharedpreferences


【解决方案1】:

我也有类似的症状,后来才发现是自动备份功能(Android 6 引入)。卸载不会清除该数据,因为它是从 Google 的云(只是您的 Google 云端硬盘)获取的。

阅读更多:https://developer.android.com/guide/topics/data/autobackup

要对此进行测试,只需禁用备份功能,然后重复测试以确保您获得预期的默认值。将android:allowBackup 设置为false

<manifest ... >
    ...
    <application android:allowBackup="false" ... >
        ...
    </application>
</manifest>

另外,我不能不敦促您不要将权限状态存储在本地磁盘上。为什么不在运行时调用Context.checkCallingOrSelfPermission()?这是更安全的方式。

【讨论】:

  • 谢谢,问题解决了。我不确定如何使用 Context.checkCallingOrSelfPermission()。如果我使用 Context.checkSelfPermission() 并且用户拒绝该权限,我上面的代码会一直向用户询问权限,直到我获得权限。我不确定如果不将状态存储在 SharedPreferences 中,我还能如何防止这种情况发生。
  • @rated2016 总体思路应该是这样的:if (anyContext.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ Log.d(TAG, "Our app needs a missing permission, will now ask for it"); activityContext.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123); } 为了避免用权限请求锤击用户,您应该设计一个“入职流程”,在该流程中,您仅在您首先请求权限的流程中请求权限“说服用户”为什么她会授予您这些权限...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2013-09-24
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多