我需要在Android设备中存储创建的ID,此ID应该由设备中安装的几个应用程序中的第一个创建,并且应该被其中的任何其他应用程序读取。设备。它还需要与所有Android设备一起使用。
我尝试使用内容提供商,但看起来我不能拥有几个具有相同权限的内容提供商,并且对每个内容提供商拥有不同的权限,这将搜索每个应用程序的所有权限,这不是一个可行的选择。
我也尝试修改用户词典,但是一些Android版本,特别是三星的,不允许设置字典或者没有安装默认出现的字典,所以我没有访问权限。
所以我的问题是:
我如何拥有一个全局变量,一个字符串,可以由设备中安装的任何应用程序创建和读取?有没有办法实现这个目标?某种全球字典或类似的东西?
答案 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();
}