• Android获取SharedPreferences失败,且App无法启动


    说明:

    一个app访问另外一个app的SharedPreferences,程序启动之后没有显示界面就卡死了,无任何提示信息。

    错误原因:

    应用调用createPackageContext失败,但是也不给出异常信息;

    /*
     * SharedPreferences sp = getSharedPreferences("ethernet",
     *      //Context.MODE_WORLD_WRITEABLE);
     *      Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
     */
    
    Context ethernetAppContext = null;
    try {
        ethernetAppContext = createPackageContext("com.dog.ethernet", Context.CONTEXT_IGNORE_SECURITY);
    } catch (NameNotFoundException e) {
        new AlertDialog.Builder(this).setTitle("ERROR").setMessage("Please install ethernet application.").setPositiveButton("confirm", null ).show();  
        System.exit(-1);
        e.printStackTrace();
    }   
    
    SharedPreferences sharedPreferences = ethernetAppContext.getSharedPreferences("ethernet",  Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);   
    Log.e("info", "-------------------------------------------------");
    Log.e("info", sharedPreferences.getString("conn_mode", ""));
    Log.e("info", sharedPreferences.getString("mIpaddr", ""));
    Log.e("info", sharedPreferences.getString("mDns", ""));
    Log.e("info", sharedPreferences.getString("mProxyIp", ""));
    Log.e("info", sharedPreferences.getString("mProxyPort", ""));
    Log.e("info", sharedPreferences.getString("mProxyExclusionList", ""));
    Log.e("info", "-------------------------------------------------");
    
    • 最后通过查看/data/data/路径下的包名,检查到com.dog.ethernet包名不存在,于是修改为正确的包名就正常了。
    • 将当前包下生成ethernet SharedPreferences的代码注释了才能获取到正确的数据,如果不注释掉,好像获取的数据是当前包下的ethernet SharedPreferences,花了挺长时间才确定这个问题。

    获取结果

    E/info    ( 5353): -------------------------------------------------
    E/info    ( 5353): manual
    E/info    ( 5353): 10.10.10.10
    E/info    ( 5353): 8.8.8.8
    E/info    ( 5353): -------------------------------------------------
    

    Android.mk

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := $(call all-java-files-under, com)
    
    LOCAL_PACKAGE_NAME := ethernetCF
    LOCAL_CERTIFICATE := platform
    
    include $(BUILD_PACKAGE)
    
    # Use the folloing include to make our test apk.
    include $(call all-makefiles-under,$(LOCAL_PATH))
  • 相关阅读:
    2019-8-31-C#-标准性能测试高级用法
    2018-8-29-Roslyn-通过-Target-修改编译的文件
    2018-8-29-Roslyn-通过-Target-修改编译的文件
    2018-2-13-图论-Warshall-和Floyd-矩阵传递闭包
    2018-2-13-图论-Warshall-和Floyd-矩阵传递闭包
    2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
    netfilter
    mmap内存映射
    vim替换字符串
    vim环境配置
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/5445672.html
Copyright © 2020-2023  润新知