Android, का पता लगाने जब अन्य क्षुधा शुरू कर रहे हैं


92

मैं एक ऐसा ऐप विकसित करने की कोशिश कर रहा हूं, जो उपयोगकर्ता को पासवर्ड के बिना किसी निर्दिष्ट ऐप पर जाने से रोकता है। परिदृश्य है ...

  1. उपयोगकर्ता "ईमेल" ऐप पर क्लिक करता है (उदाहरण के लिए)
  2. मेरा ऐप किसी ऐप के लॉन्च का पता लगाता है
  3. मेरा ऐप पुष्टि करता है कि यह "ईमेल" ऐप है
  4. मेरा ऐप पासवर्ड मांगते हुए, शीर्ष पर एक दृश्य खोलता है
  5. उपयोगकर्ता एक पासवर्ड दर्ज करता है, यदि सही है, तो मेरा ऐप गायब हो जाता है, शीर्ष पर "ईमेल" ऐप छोड़कर

मैं ठीक हूँ, इसके बाकी हिस्से में, बस भाग 2 मुझे हैरान कर रहा है, और कई दिनों के बाद ब्रॉडकास्ट इंटेंट्स आदि को पढ़ने और मेरे परीक्षण परियोजनाओं में "android.intent.action.Main" आदि के लिए सुनने की कोशिश कर रहा हूं। पता चलता है जब मेरा के अलावा एक ऐप शुरू किया जाता है।

क्या कोई मदद कर सकता है? क्या मैं इसके बारे में सही तरीके से जा रहा हूं, नए ऐप्स की तलाश में, जो शुरू करने के इरादे से प्रसारण कर रहे हैं, या मुझे नए इंटेंट के लिए सिस्टम लॉग पढ़ना चाहिए, या मूल कोड में कुछ करना चाहिए?

कोई भी संकेत मदद करेगा, भले ही आप इसका पूरी तरह से जवाब न दे सकें, मैं कुछ और शोध करने में सक्षम हूं। बहुत बहुत धन्यवाद। इयान


मुझे यकीन नहीं है कि उन्होंने यह कैसे किया है, लेकिन ऐप प्रोटेक्टर जैसे ऐप ठीक वही करते हैं जो आप पूछ रहे हैं, इसलिए यह तकनीकी रूप से संभव है।
हनस्पाइड

@ आप अपना मुद्दा कैसे सुलझा सकते हैं, कृपया अपने ज्ञान को साझा कर सकते हैं
nida

नमस्ते क्या आपको समाधान मिल गया है?
ask4solutions

जवाबों:


34

मुझे लगता है कि हम logcat इसका उत्पादन कर सकते हैं और इसका विश्लेषण कर सकते हैं ।

सभी समान कार्यक्रमों में मुझे इसकी अनुमति मिली है:

android.permission.READ_LOGS

इसका मतलब है कि वे सभी इसका उपयोग करते हैं, लेकिन ऐसा लगता है कि कार्यक्रम शुरू होता है और उसके बाद हमारा कार्यक्रम (ऐप रक्षक) शुरू होगा और सामने लाएगा।

नीचे दिए गए कोड का उपयोग करें:

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

और इसे मेनिफेस्ट फ़ाइल में अनुमति जोड़ना न भूलें।


कृपया, हमें यह कोड कहां रखना होगा? एक सेवा में onStartCommand () में?
हैथेम स्मिस्सी

56
जेलीबीन और इसके बाद के संस्करण से काम नहीं करेगा। READ_LOGS की अनुमति अब केवल सिस्टम ऐप्स के लिए आरक्षित है।
रैन

5
क्या आपको इस पर पूरा यकीन है? क्योंकि स्मार्ट AppLock JB डिवाइस पर भी ऐसा करने में सक्षम है। क्या ऐसा इसलिए है क्योंकि एप्लिकेशन डिवाइस व्यवस्थापक की स्थिति में खुद को ऊपर उठाता है? play.google.com/store/apps/…
कार्तिक बालकृष्णन

1
@ टॉर्सेलाइट, उस ऐप में "गेट रनिंग टास्क" की अनुमति है, इसलिए हो सकता है कि वह उस तकनीक का उपयोग कर रहा हो।
सैम

1
@ तो अब इसका उपयोग करने के लिए क्या करना चाहिए ... क्या इस समस्या के समाधान के लिए अब कोई समाधान उपलब्ध है, क्योंकि मुझे जेली बीन्स से ऊपर रहने की आवश्यकता है ... कृपया अपनी प्रतिक्रिया दें ...
श्रेया मेहता

19

ऐसा करने का एक बनावटी तरीका है कि एक समयबद्ध लूप के साथ एक सेवा है जो जांचता है

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

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

नोट: यह वास्तव में स्क्रीन पर मौजूद व्हाट्स की एक सूची नहीं है, बस व्हाट्स की एक सूची चल रही है ... थोड़े अपने लक्ष्य को शून्य कर रहा है, लेकिन कम से कम आपको पता चल जाएगा कि कब कुछ चलना शुरू हो रहा है ... यह उसी में रहेगा। हालांकि पृष्ठभूमि में भी सूची।

पासवर्ड की बात के लिए आप बस अपनी गतिविधि शुरू कर सकते हैं जब आपको एक ऐप मिल जाता है जो संरक्षित या जो भी हो।


क्या उस समय को प्राप्त करना संभव है जब ऐप लॉन्च किया गया / फिर से शुरू किया गया?
ललीनया १14

4
इसके android.app.usageबजाय Android L में पैकेज का उपयोग करें । developer.android.com/reference/android/app/usage/...
Plo_Koon

12

मुझे लगता है और आशा है कि यह संभव नहीं है। विचार करें कि दुर्भावनापूर्ण सॉफ़्टवेयर द्वारा इस तरह की कार्यक्षमता का आसानी से दुरुपयोग कैसे किया जा सकता है। आप अपने द्वारा निर्देशित इरादों को सुन सकते हैं, और जो प्रसारित होते हैं, लेकिन एप्लिकेशन लॉन्चिंग एक प्रसारण घटना नहीं होनी चाहिए।

आप जो करने में सक्षम हो सकते हैं वह लॉन्चर को बदल देगा । यदि उपयोगकर्ता इससे सहमत है।


1
यह संभव क्यों नहीं होना चाहिए? यह मेरी डिवाइस है और मैं तय करता हूं कि मुझे इस पर क्या चलाना है। हम नियमित रूप से अनुदान की अन्य अनुमतियों की तुलना में यह कैसे अधिक समस्या है? एक प्रतिस्थापन लॉन्चर केवल उन सभी ऐप्स के लॉन्च को नहीं पकड़ेगा, जो इसके द्वारा सीधे लॉन्च किए गए हैं। इस पर कई टिप्पणियां हैं और एसओ पर इसी तरह के धागे हैं जो दावा करते हैं कि केवल इरादों को देखने में सक्षम होने से कुछ बड़े पैमाने पर समस्या होगी, लेकिन कोई यह नहीं बताता है कि समस्या क्या है और इसे इतना बुरा क्यों माना जाना चाहिए कि विशेषाधिकारों की मौजूदा प्रणाली नहीं हो सकती है इसका उपयोग उपयोगकर्ता को यह स्पष्ट करने के लिए किया जाता है कि क्या हो रहा है।
केविन व्हाइटफुट

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

12
class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

आप वर्तमान चल रहा है Activityऔर जाँच कर सकते हैं कि क्या यह आवेदन से Activityमेल खाता है Email

स्टार्ट CheckRunningActivity Threadपर Application(या डिवाइस बूट पर) रन करें ।

new CheckRunningActivity().start();

अपडेट: इस वर्ग को android.permission.GET_TASKSअनुमति की आवश्यकता है, इसलिए अगली पंक्ति को मेनिफेस्ट में जोड़ें:

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

मैं इस दृष्टिकोण का उपयोग कर रहा हूं, लेकिन यह आपके "// को आपकी गतिविधि को यहां दिखाई देगा। यहां पर PACKAGE_NAME.ACTIVITY_NAME के ​​शीर्ष पर" बार-बार लूप के कारण दिखाई देगा। उसके लिए कोई वर्कअराउंड?
अनुज शर्मा

वांछित परिणाम प्राप्त करने पर CheckRunningActivity थ्रेड को रोकें
वीसेस्लाव गेदरजी

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

समस्या के संदर्भ पर निर्भर करता है, अधिक जानकारी में वर्णन करें कि आप क्या प्राप्त करना चाहते हैं।
वीसेस्लाव गेदरजी

2
यहां आपके कोड में, Looper.loop()स्टेटमेंट ऐसा लगता है कि while(true)लूप के कभी खत्म नहीं होने के कारण इसे कभी भी निष्पादित नहीं किया जाएगा । क्या यह गलती है?
सैम

11

मुख्य मुद्दा यह है कि जब आप लॉन्चर इंटेंसिव का उपयोग कर रहे हैं तो लॉन्चर (होम स्क्रीन) आमतौर पर स्पष्ट इंट्रेंस के लिए सुनने की कोशिश कर रहे हैं।

एक निहित आशय यह है कि जब आप "कोई इस वीडियो को चलाना चाहते हैं" कहना चाहते हैं और एंड्रॉइड एक ऐप चुनता है जो उस इरादे को संभाल सकता है।

एक स्पष्ट आशय यह है कि जब आप होम स्क्रीन पर "ईमेल" आइकन पर क्लिक करते हैं तो क्या होता है। यह विशेष रूप से एंड्रॉइड को उस विशिष्ट ऐप को पूरी तरह से योग्य नाम (यानी com.android.mail या कुछ और) द्वारा खोलने के लिए कह रहा है।

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

जो आप करने की कोशिश कर रहे हैं वह एंड्रॉइड सुरक्षा मॉडल के खिलाफ जाता है।

एक चीज जो आप कर सकते हैं वह है विशिष्ट ऐप डेवलपर्स के साथ अपने सुरक्षा तंत्र के इरादों को आगे बढ़ाने के लिए, लेकिन यह संभवत: ऐसा कुछ नहीं है जिससे आप निपटना चाहते हैं।


7

getRunningTasks() Android L में पदावनत किया गया है।

ऐप उपयोग के आँकड़े प्राप्त करने के लिए आप android.app.usage पैकेज से यूज़स्टैट्स क्लास का उपयोग कर सकते हैं ।

नया ऐप उपयोग सांख्यिकी एपीआई एप्लिकेशन डेवलपर्स को अनुप्रयोगों के उपयोग से संबंधित आंकड़े एकत्र करने की अनुमति देता है। यह API डेप्रिसिटेड getRecentTasks () विधि की तुलना में अधिक विस्तृत उपयोग जानकारी प्रदान करता है।

इस एपीआई का उपयोग करने के लिए, आपको पहले android.permission.PACKAGE_USAGE_STATSअपने घोषणा पत्र में अनुमति की घोषणा करनी चाहिए । उपयोगकर्ता को इस ऐप के माध्यम से भी पहुँच सक्षम करनी होगी Settings > Security > Apps with usage access

यहां एप्लिकेशन उपयोग सांख्यिकी एपीआई का उपयोग करने के लिए उपयोगकर्ताओं को अनुप्रयोगों के उपयोग से संबंधित आंकड़े एकत्र करने देने के लिए एक मूल ऐप उदाहरण दिखाया गया है।


कैसे उपयोग आँकड़े यह जानने में मदद कर सकते हैं कि कौन सा ऐप अग्रभूमि पर है?
अजय

3

शायद आपको एक सेवा की आवश्यकता है, जो पृष्ठभूमि में लगातार चलेगी। आपकी सेवा में वही है जो आपने कहा था। Android.intent.action के लिए सुनें। android.intent.category.LAUNCHER श्रेणी के साथ भी। फिर उस प्रसारण रिसीवर ने ऑनरिव विधि को ओवरराइड किया और आवेदन आदि का नाम देखने के लिए जांच की।


2
ऐसा लगता है जैसे मैं जिस विधि के बारे में सोच रहा था, लेकिन मैं एक मुख्य ब्रॉडकास्टसीवर के साथ MAIN (बिल्ली। LAUNCHER) प्रसारित करने के लिए संघर्ष कर रहा हूं। क्या पहले कोई ऐसा करने में कामयाब रहा है? इस स्तर पर मैं केवल यह पता लगाने के लिए देख रहा हूं कि एक एप्लिकेशन लॉन्च किया गया है या फिर से शुरू किया गया है। फिर मैं पैकेज नाम की तुलना स्ट्रिंग के नाम (ओं) से कर सकता हूं, जिसकी मुझे तलाश है।
इयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.