2017-03-08 39 views
1

我需要存儲創建的ID在Android設備上,這個ID應該由第一被安裝在幾個我們的應用程序的創建設備,並且應該由設備中的任何其他應用讀取。它還需要與所有Android設備配合使用。ANDROID - 我如何保存一個字符串和訪問任何應用程序

我嘗試使用內容提供商,但它看起來像我不能有相同的權限幾個內容提供商,並且具有一個用於將搜索每一個應用程序的所有當局每個內容提供商不同的機構是不是一個可行的選擇。

我也嘗試修改用戶詞典,但某些Android版本,尤其是三星的,不允許設置字典或沒有安裝自帶默認字典,所以我沒有訪問該。

所以我的問題是:

如何,我可以有一個全局變量,一個字符串,可以通過安裝在設備中的任何應用程序中創建和讀取?有什麼辦法可以做到這一點?某種全球字典或類似的東西?

回答

1

最好的辦法

ContentProviders我想,如果你正在尋找最好的方法可循。

即使在未來更多的數據,你應該使用這個選項去它是應用程序之間共享數據的好方法。

Alernative方法

應用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"> 
+0

。我需要約30個具有創建此提供程序能力的應用程序,並且如果我將相同的權限添加到所有這些應用程序,則不允許我安裝具有相同權限的新應用程序,而且還會讓每個應用程序都讀取每次搜索需要30多個權限需要太多時間。 –

+0

chck更新回答 –

+0

接受,如果它解決了你的問題 –

0

我已經得到了一個不同的方法來此,通過創建從this post一個唯一的標識符,使用Android的ID將是相同的,而手機是不是工廠reseted,我可以有一個獨特的,不可更改的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(); 
    } 
相關問題