2011-08-05 15 views
27

के शो/छुपाने के लिए एप्लिकेशन क्लास बूलियन सेट करें। मैं यह पता लगाने का प्रयास कर रहा हूं कि मेरे एप्लिकेशन को ब्रॉडकास्ट रिसीवर का उपयोग करके अपग्रेड किया गया है और मेरे एप्लिकेशन क्लास में बूलियन सेट किया गया है। यह बूलियन कुछ अन्य बूलियन के संयोजन के साथ प्रयोग किया जाएगा ताकि यह निर्धारित किया जा सके कि उपयोगकर्ता को EULA संवाद बॉक्स दिखाना है या नहीं।एंड्रॉइड ऐप अपग्रेड का पता लगाएं और ईयूएलए

मुझे विश्वास है कि मुझे यह सब ठीक से सेटअप मिला है, लेकिन जब भी यह नहीं होना चाहिए तो EULA अभी भी दिख रहा है। विशेष रूप से जब उपयोगकर्ता ने पिछले संस्करण में ईयूएलए को पहले ही स्वीकार कर लिया है, तो ईयूएलए संस्करण में परिवर्तित नहीं हुआ है (मैन्युअल रूप से मेरे द्वारा निर्धारित), और ऐप को अपग्रेड किया जा रहा है।

मेरा मानना ​​है कि यह काम नहीं कर रहा है क्योंकि मेरा एप्लिकेशन नहीं चल रहा है और इसलिए isAppUpgrade() विधि को बुलाया जा रहा है और सही बूलियन ध्वज सेट नहीं किया जा रहा है। क्या कोई यह पुष्टि कर सकता है कि यह मामला है, या मेरे कोड में कुछ गड़बड़ है?

एफवाईआई - ईयूएलए.शो (गतिविधि, बूलियन, बूलियन) स्थैतिक विधि को मेरी मुख्य गतिविधि में पहली बात कहा जा रहा है।

यहाँ कुछ कोड

आवेदन कक्षा

public class MFCApplication extends Application { 

    private boolean isUpgrade = false; 

    /** 
    * Returns a manually set value of whether the EULA has changed in this version of the App 
    * @return true/false 
    */ 
    public boolean hasEULAChanged() { 
     return false; 
    } 

    /** 
    * Returns whether or not the application has been upgraded. Set by the UpgradeBroadcastReceiver 
    * @return true/false 
    */ 
    public boolean isAppUpgrade() { 
     return isUpgrade; 
    } 

    /** 
    * Method called by UpgradeBroadcastReceiver if the App has been upgraded 
    */ 
    public void setAppIsUpgrade() { 
     this.isUpgrade = true; 
    } 
} 

है BroadcastReceiver

public class UpgradeBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent == null) 
      return; 
     if (context == null) 
      return; 

     String action = intent.getAction(); 
     if (action == null) 
      return; 

     if (action.equals(Intent.ACTION_PACKAGE_REPLACED)) { 
      MFCApplication myApp = ((MFCApplication)((Activity)context).getApplication()); 

      myApp.setAppIsUpgrade(); 
     } 
    } 
} 

EULA कक्षा

public class EULA { 

    private static final String EULA_ASSET = "EULA"; 
    private static final String EULA_PREFERENCES = "eula"; 
    private static Activity mActivity; 

    private static PackageInfo getPackageInfo() { 
     PackageInfo pi = null; 
     try { 
      pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES); 
     } catch (PackageManager.NameNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     return pi; 
    } 

    public static boolean show(Activity activity, boolean hasEULAChanged, boolean isAppUpgrade) { 
     mActivity = activity; 
     final SharedPreferences preferences = activity.getSharedPreferences(EULA_PREFERENCES, Activity.MODE_PRIVATE); 
     final PackageInfo packageInfo = getPackageInfo(); 
     String eulaPref = preferences.getString(EULA_PREFERENCES, "0"); 
     boolean eulaVersionAccepted = packageInfo.versionName.equals(eulaPref); 
     if (!eulaVersionAccepted && (hasEULAChanged || !isAppUpgrade)) { 
      //The EULA should be shown here, but it isn't 
      return false; 
     } 
     return true; 
    } 
} 

आवेदन प्रकट

<receiver android:name=".helpers.UpgradeBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
     <data android:scheme="package" android:path="com.hookedroid.fishingcompanion" /> 
    </intent-filter> 
</receiver> 
+0

असल में मुझे एक इरादा मिलता है जब ऐप को प्रतिस्थापित किया जा रहा है, लेकिन हो सकता है कि यह केवल इसलिए है क्योंकि मैं ग्रहण के माध्यम से ऐप इंस्टॉल करता हूं? –

उत्तर

54

यह बहुत आसान है बस अपने वर्तमान एप्लिकेशन संस्करण की जांच करने के लिए है।

PackageInfo packageInfo = activity.getPackageManager() 
    .getPackageInfo(activity.getPackageName(), 0); 
int versionCode = packageInfo.versionCode; 

जब आपका ऐप शुरू होता है, तो आप संस्करण कोड के साथ एक पूर्णांक मान के लिए अपने साझा संदर्भों की जांच करते हैं। यदि कोई नहीं है, या यदि यह मेल नहीं खाता है, तो EULA प्रदर्शित करें। उपयोगकर्ता EULA स्वीकार करता है, तो ShareCode मान को SharePreferences में लिखें।

versionCode आपके द्वारा प्रकट किए गए संस्करण संख्या से मेल खाएगा।

+0

धन्यवाद EboMike! जैसे ही मैंने इसे पोस्ट किया, मुझे एहसास हुआ कि एक आसान तरीका था (यह बाद में हाहा है), जो आप सुझाव दे रहे हैं। मैं यह भी जांचता हूं कि अगर उन्होंने ईयूएलए स्वीकार कर लिया है लेकिन ईयूएलए को दिखाने के लिए ईयूएलए इस संस्करण में बदल गया है। धन्यवाद! – hooked82

19

मूल दृष्टिकोण के अनुसार, मैं अगर एप्लिकेशन BroadcastReceiver

public YourUpgradeReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Uri packageName = intent.getData(); 
     if(packageName.toString().equals("package:" + context.getPackageName()){ 
      //Application was upgraded 
     } 
    } 
} 

और अपने प्रकट

<receiver android:name=".YourUpgradeReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.PACKAGE_REPLACED"/> 
       <data android:scheme="package"/> 
      </intent-filter> 
</receiver> 
+0

कौन सा सबसे अच्छा संपर्क है? आपका या 'इबोमाइक' द्वारा सुझाया गया है ?? – AndiGeeky

+2

आपको अपने लिए एक सरल सवाल करना है: क्या आपको किसी ईवेंट-आधारित दृष्टिकोण की आवश्यकता है या क्या यह आपके ऐप के एक निश्चित बिंदु पर इसकी जांच करने के लिए पर्याप्त है? यदि आप उस जानकारी को उस समय सही चाहते हैं जब आपका ऐप अपडेट हो जाए, तो मेरे समाधान के लिए जाएं (उदाहरण: पृष्ठभूमि सेवा)। यदि अगले आवेदन शुरू होने पर इसे जानना पर्याप्त है, तो दूसरा समाधान लें। लेकिन आप मेरा समाधान भी ले सकते हैं और कुछ ऐसे लिखने के लिए लिख सकते हैं जिन्हें आप बाद में जांच सकते हैं जैसे ईबोमैक्स सैद्धांतिक रूप से –

+0

से संपर्क कर सकते हैं मैं इसका परीक्षण कैसे कर सकता हूं? –

4

में पता लगाने का उपयोग करके उन्नत बनाया है पता लगाने के लिए यह कामयाब रहे तो ऐप को अपडेट किया गया है

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
int versionCode = sharedPreferences.getInt("VERSION_CODE", BuildConfig.VERSION_CODE); 

if(versionCode != BuildConfig.VERSION_CODE) { 
    onAppUpdated(); 
} 

sharedPreferences.edit().putInt("VERSION_CODE", BuildConfig.VERSION_CODE).apply(); 
0

यहां एक आसान तरीका था टी आपकी समस्या का समाधान कर सकते हैं। अपने कोड में आप आसानी से ऐप वर्जन कोड और वर्जननाम प्राप्त कर सकते हैं। पंजीकरण के बाद पहले स्थापित करें जीसीएम ने साझाकरण में संस्करण नाम को सहेज लिया। आपके घर की गतिविधि में आप isAppUpdated() की जांच करते हैं। यदि वर्तमान APP VERSION_NAME संग्रहित VERSION_NAME से मेल नहीं खाता है तो जीसीएम आईडी पुनः पंजीकृत करें।

सहेजें वरीयताओं में संस्करण नाम::

public static void saveVersionNameAndCode(Context context){ 
     try{ 
      PackageInfo packageInfo = context.getPackageManager() 
        .getPackageInfo(context.getPackageName(), 0); 
      int versionCode = packageInfo.versionCode; 
      String versionName=packageInfo.versionName; 

      CommonTasks.showLog("Saving APP VersionCode and Version Name"); 

      // SAVE YOUR DATA 

     }catch(Exception e){ 
     } 
    } 

चेक अनुप्रयोग उन्नत है:

public static boolean isAppUpdated(Context context){ 
     boolean result=false; 
     try{ 
      PackageInfo packageInfo = context.getPackageManager() 
        .getPackageInfo(context.getPackageName(), 0); 
      int versionCode = packageInfo.versionCode; 
      String versionName=packageInfo.versionName; 

      String prevVersionName= GET STORED VERSION_NAME; 
      if(prevVersionName!=null && !prevVersionName.equals("") && 
        !prevVersionName.equals(versionName)){ 
       showLog("App Updated"); 
       result=true; 
      }else{ 
       showLog("App Not updated"); 
      } 

     }catch(Exception e){ 
     } 
     return result; 
    } 

यहाँ, अगर isAppUpdated() सही साधनों लौट

यहाँ नमूना कोड है आपको जीसीएम आईडी पुनः पंजीकृत करना होगा।

संबंधित मुद्दे