ANDROID - 如何保存字符串并从任何应用程序访问它

时间:2017-03-08 14:20:59

标签: java android global-variables android-contentprovider

我需要在Android设备中存储创建的ID,此ID应该由设备中安装的几个应用程序中的第一个创建,并且应该被其中的任何其他应用程序读取。设备。它还需要与所有Android设备一起使用。

我尝试使用内容提供商,但看起来我不能拥有几个具有相同权限的内容提供商,并且对每个内容提供商拥有不同的权限,这将搜索每个应用程序的所有权限,这不是一个可行的选择。

我也尝试修改用户词典,但是一些Android版本,特别是三星的,不允许设置字典或者没有安装默认出现的字典,所以我没有访问权限。

所以我的问题是:

我如何拥有一个全局变量,一个字符串,可以由设备中安装的任何应用程序创建和读取?有没有办法实现这个目标?某种全球字典或类似的东西?

2 个答案:

答案 0 :(得分:1)

最佳方法

ContentProviders我认为如果您正在寻找最佳方法,请遵循。

即使将来有更多数据,您也应该使用此选项,这是在应用程序之间共享数据的好方法。

Alernative Approach

应用1(例如:app1包名称为" com.app1")。

SharedPreferences prefs = getSharedPreferences("pref1",
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("stringDemo1", strShareValue);
            editor.commit();

App2(您可以根据需要将其用于其他30个应用程序)(从应用1中的共享首选项中获取数据)。

    try {
            con = createPackageContext("com.app1", 0);//first app package name is "com.sharedpref1"
            SharedPreferences pref = con.getSharedPreferences(
                        "pref1", Context.MODE_PRIVATE);
            String your_data = pref.getString("stringDemo1", "No Value");
        } 
    catch (NameNotFoundException e) {
                Log.e("Not data shared between two applications", e.toString());
         }

在app1和app2中,应用程序30个清单文件添加相同的共享用户ID&标签,

 android:sharedUserId="any string" 
 android:sharedUserLabel="@string/any_string"

两者都相同......共享用户标签必须来自string.xml

了解更好,请查看以下示例。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxxx"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="any string" 
android:sharedUserLabel="@string/any_string">

答案 1 :(得分:0)

我设法通过创建this post中的唯一标识符并使​​用Android ID来实现不同的方法,但手机未经工厂重置,我可以使用唯一且不可更改的ID,因此任何应用只需加载此ID。

这是我使用的代码:

/**
     * Return pseudo unique ID
     * @return ID
     */
    public static String getUniquePsuedoID(Context context) {
        // If all else fails, if the user does have lower than API 9 (lower
        // than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
        // returns 'null', then simply the ID returned will be solely based
        // off their Android device information. This is where the collisions
        // can happen.
        // Thanks http://www.pocketmagic.net/?p=1662!
        // Try not to use DISPLAY, HOST or ID - these items could change.
        // If there are collisions, there will be overlapping data
        String android_id = Settings.Secure.getString(context.getContentResolver(),
                Settings.Secure.ANDROID_ID);
        String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + android_id + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

        // Thanks to @Roman SL!
        // https://stackoverflow.com/a/4789483/950427
        // Only devices with API >= 9 have android.os.Build.SERIAL
        // http://developer.android.com/reference/android/os/Build.html#SERIAL
        // If a user upgrades software or roots their device, there will be a duplicate entry
        String serial = null;
        try {
            serial = android.os.Build.class.getField("SERIAL").get(null).toString();

            // Go ahead and return the serial for api => 9
            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
        } catch (Exception exception) {
            // String needs to be initialized
            serial = "serial"; // some value
        }

        // Thanks @Joe!
        // https://stackoverflow.com/a/2853253/950427
        // Finally, combine the values we have found by using the UUID class to create a unique identifier
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }