दिलचस्प पोस्ट
दूरस्थ मॉडल के साथ बूटस्ट्रैप 3 मैं अपना स्विंग वर्कर उदाहरण कैसे ठीक से काम कर सकता हूं? सूचक के विभिन्न स्तरों के लिए उपयोग करता है? क्या पाठ एक पाठ क्षेत्र में एक नई लाइन का प्रतिनिधित्व करता है बिटबाकेट को धक्का जाने के बाद एटलसियन "लोगो" कैसे केवल एकल उद्धरणों से बचने के लिए? Postgres में खोजशब्द-जैसी कॉलम नामों से बचें बिग-ओ और लिटिल-ओ नोटेशन के बीच अंतर मैं Python webdriver में phantomjs / ghostdriver के लिए एक प्रॉक्सी कैसे सेट करूं? कैसे जावास्क्रिप्ट में नेस्टेड सरणी समतल करने के लिए? किसी वेबसाइट पर Google डिस्क में संग्रहीत फ़ाइलों को प्रदर्शित करना (उदा गतिशील स्तंभ एसक्यूएल बनाएँ सी ++ 11 "ऑटो" शब्दार्थ वापसी कुंजी के साथ UITextView के लिए कीबोर्ड को कैसे खारिज करें? कैलेंडर आवर्ती / दोहराए जाने वाले कार्यक्रम – सर्वश्रेष्ठ संग्रहण विधि

UsageStatsManager का उपयोग कैसे करें?

पृष्ठभूमि

Google ने "ActivityManager" वर्ग के " getRecentTasks " फ़ंक्शन को बहिष्कृत कर दिया है। अब यह सब उन ऐप्स की सूची प्राप्त करना है जो वर्तमान ऐप ने खोला है।

मैंने इसके बारे में स्टैक ओवरफ्लो पर एक पोस्ट भी लिखी है, लेकिन मैंने देखा कि यह असंभव है

समस्या

मैंने इसके बारे में एक पोस्ट बना दिया है ( यहां , और दूसरा, किसी और के द्वारा बनाई गई एक समान, यहां ) और उस पर पुनः विचार करने का अनुरोध किया, और Google ने एक नया वर्ग बनाने का फैसला किया, जो समान कार्यक्षमता प्रदान करते हुए लगता है आँकड़े, लेकिन यह भी उपयोगी हो सकता है), लेकिन मैं यह कैसे पता लगाने के लिए उपयोग नहीं कर सकता।

वर्ग को "UsageStatsManager" कहा जाता है, और मेरा अनुमान है कि " queryUsageStats " फ़ंक्शन कार्य करता है

इसके अलावा, ऐसा लगता है कि इसकी एक नई अनुमति ("android.permission.PACKAGE_USAGE_STATS") है, जो सिस्टम की अनुमति है, लेकिन यह लिखा है कि:

अनुमति घोषित करने का मतलब एपीआई का उपयोग करने का इरादा है और डिवाइस के उपयोगकर्ता सेटिंग्स एप्लिकेशन के माध्यम से अनुमति दे सकते हैं।

यहाँ इस नई कार्यक्षमता के बारे में एक और कड़ी है।

मैंने क्या पाया है

मैंने एंड्रॉइड के कोड को देखा है, और देखा है कि "प्रसंग" में USAGE_STATS_SERVICE है, जो जावा डॉक्स में अगली चीज़ कहता है:

/** * Use with {@link #getSystemService} to retrieve a {@link * android.app.UsageStatsManager} for interacting with the status bar. * * @see #getSystemService * @see android.app.UsageStatsManager * @hide */ public static final String USAGE_STATS_SERVICE = "usagestats"; 

अजीब बात यह है कि न केवल यह "स्टेटस बार" कहता है, बल्कि पैकेजनाम भी मेल नहीं खाता (इसके बजाय "android.app.usage.UsageStatsManager" होना चाहिए)।

मैंने सही अनुमति भी जोड़ दी है:

 <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> 

और यहां का कोड मैं उपयोग करता हूं:

  final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE); final int currentYear=Calendar.getInstance().get(Calendar.YEAR); final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear); 

खुद के एमुलेटर में, मैं "सेटिंग्स" -> "सुरक्षा" -> "उपयोग के उपयोग के साथ ऐप" पर गया, और मेरे ऐप को सक्षम किया।

हालांकि, जब कोड चल रहा है, मुझे बस एक खाली सूची है …

प्रश्न

आप UsageStatsManager का उपयोग कैसे करते हैं?

इसके अलावा, आप उपयोगकर्ता को अनुमति देने के लिए सबसे आसान तरीके से कैसे अनुमति दें? या यह स्वचालित रूप से किया जाता है, जैसे ही ऐप आवश्यक जानकारी प्राप्त करने की कोशिश करता है?

इस वर्ग का उपयोग करने की कोशिश करते समय क्या होता है, लेकिन उपयोगकर्ता ने अभी तक इसकी पुष्टि नहीं की है?

मैं कोड कैसे कर सकता हूं, मुझे ऐप की एक वास्तविक सूची लौटाया जा सकता है?

वेब के समाधान से एकत्रित समाधान "UsageStatsManager का उपयोग कैसे करें?"

मुझे लगता है कि दस्तावेज कैलेंडर सामान के लिए छोटा हाथ था। मुझे नहीं लगता कि यह वास्तव में 2014 के साथ काम करता है; हालांकि मैं गलत हो सकता है

UsageStats की वास्तव में सूची तक पहुंचने के लिए, आपको सही माह, दिन और वर्ष के साथ कैलेंडर ऑब्जेक्ट बनाना होगा। वास्तव में एमआरके ने दूसरे जवाब में कहा था। मैंने एमआरके के कोड में त्रुटियों की प्रतिलिपि बनाई और सुधार किया था ताकि भविष्य में इसे देखे जाने वाले व्यक्ति इसे देख सकें।

 Calendar beginCal = Calendar.getInstance(); beginCal.set(Calendar.DATE, 1); beginCal.set(Calendar.MONTH, 0); beginCal.set(Calendar.YEAR, 2012); Calendar endCal = Calendar.getInstance(); endCal.set(Calendar.DATE, 1); endCal.set(Calendar.MONTH, 0); endCal.set(Calendar.YEAR, 2014); final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis()); 

-क्रेडिट एमआरके; मेरे द्वारा सुधारा (वह गलती से बस शुरू होने के बजाय कैल डाल दिया और कॉल समाप्त)

उपयोग पहुंच सेटिंग के लिए कोड नीचे है। 🙂

 Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); startActivity(intent); 

मैंने अपने Github पर UsageStats का उपयोग करने का एक नमूना बनाया है I उम्मीद है कि यह किसी के लिए मदद की हो सकती है

https://github.com/ColeMurray/UsageStatsSample

अपने आखिरी प्रश्न का उत्तर देकर "मैं कैसे कोड बना सकता हूं, मुझे ऐप की वास्तविक सूची वापस करनी है?" queryUsageStats प्रारंभ समय और समाप्ति समय मिलीसेकंड में लेता है, नहीं int में वर्ष का मान

 Calendar beginCal = Calendar.getInstance(); beginCal.set(Calendar.DATE, 1); beginCal.set(Calendar.MONTH, 0); beginCal.set(Calendar.YEAR, 2012); Calendar endCal = Calendar.getInstance(); endCal.set(Calendar.DATE, 1); endCal.set(Calendar.MONTH, 0); endCal.set(Calendar.YEAR, 2014); final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis()); 

यह साल 2012 और 2013 के लिए यूज़ेस्टस्टैट्स की एक सूची वापस करनी चाहिए (ध्यान रखें कि अंत के समय अंतिम परिणाम समय सीमा के अनन्य हैं)।

उपयोगकर्ता का प्रयोग करें सूचनाओं को गलत सूचना मिलेगी जब उपयोगकर्ता अधिसूचना ड्रॉवर खोलता है या लॉक स्क्रीन पर। आपको UsageStatsManager.queryEvents () का उपयोग करना होगा और MOVE_TO_FOREGROUND इवेंट प्रकार के साथ नवीनतम ईवेंट देखें।

वास्तव में एओएसपी नमूना कोड में शामिल एक उदाहरण एप है : developers/samples/android/system/AppUsageStatistics/

इसमें UsageStats में UsageStats का उपयोग करने के लिए आवश्यक सभी बिट्स शामिल हैं:

  1. AndroidManifest.xml में अनुमति घोषित करना

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>

  2. UsageStatsManager को एक्सेस करने की अनुमति देने के लिए सेटिंग दिखाएं

    startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

  3. आँकड़ों के लिए क्वेरी उपयोग UsageStatsManager

     Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); List<UsageStats> queryUsageStats = mUsageStatsManager .queryUsageStats(intervalType, cal.getTimeInMillis(), System.currentTimeMillis()); 
  4. UsageStats पर आधारित ऐप्स की एक सूची बनाना

संक्षेप में और अपने उदाहरण पर लागू करने के लिए:

  • आप उपयोग आंकड़े तक पहुंचने के लिए सही तरीके से पूछते हैं और अनुदान देते हैं।
  • आप UsageStats सिस्टम सेवा को सही तरीके से प्राप्त करते हैं।
  • हालांकि, उस समय की अवधि जिसे आप क्वेरी करते हैं, वह कम करने का तरीका है: तर्क beginTime और endTime समय युग से मिलीसेकंड में मापा जाता है। Calendar उदाहरण आपको getTimeinMillis() साथ इस मान दे सकते हैं आप जो ग़लती से करते हैं वह केवल वर्ष संख्याओं ( 2015 और 2017 यदि आप आज कार्यक्रम चलाएंगे)। इन मूल्यों को युग के बाद मिलीसेकंड के रूप में व्याख्या किया जाता है और इस प्रकार अंतराल केवल 2 मिलीसेकंड लंबा है और कुछ समय में 1 9 70 में है।

आपके द्वारा पोस्ट किए गए निम्नलिखित कोड स्निपेट के बजाय, आपको नीचे दिए गए उदाहरण की प्रतिलिपि बनाना चाहिए:

गलत:

 final int currentYear=Calendar.getInstance().get(Calendar.YEAR); final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear); 

सही बात:

 final long currentTime = System.currentTimeMillis(); // Get current time in milliseconds final Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -2); // Set year to beginning of desired period. final long beginTime = cal.getTimeInMillis(); // Get begin time in milliseconds final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginTime, currentTime); 

आप ऐसा कर सकते हैं

 //noinspection ResourceType final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE); final int currentYear=Calendar.getInstance().get(Calendar.YEAR); final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);