Android, Diğer uygulamalar başlatıldığında algıla


94

Bir kullanıcının belirli bir uygulamaya parola olmadan erişmesini engelleyen bir uygulama geliştirmeye çalışıyorum. Senaryo ...

  1. kullanıcı "E-posta" uygulamasını tıklar (örneğin)
  2. uygulamam bir uygulamanın başlatıldığını tespit ediyor
  3. uygulamam bunun "E-posta" uygulaması olduğunu onaylıyor
  4. uygulamam üstte bir görünüm açıyor ve şifre istiyor
  5. kullanıcı bir şifre girerse, doğruysa uygulamam kaybolur ve "E-posta" uygulamasını üstte bırakır

Geri kalanını yapıyorum, sadece 2. bölüm kafamı karıştırıyor ve günlerce Yayın Amaçları vb. Okuyup "android.intent.action.MAIN" vb. Deneme projelerimde dinlemeye çalıştıktan sonra yapamam benimki dışında bir uygulamanın ne zaman başlatıldığını tespit ediyor gibi görünüyor.

Biri yardım edebilir mi? Başlamak için bir niyet yayınlayan yeni uygulamalar ararken doğru yoldan mı gideceğim, yoksa yeni amaçlar için sistem günlüğünü okumalı mıyım veya yerel kodda bir şey mi yapmalıyım?

Herhangi bir ipucu yardımcı olacaktır, tam olarak cevaplayamasanız bile biraz daha araştırma yapabilirim. Çok teşekkürler. Ian


Bunu nasıl yaptıklarından emin değilim, ancak App Protector gibi uygulamalar tam olarak sizin istediğinizi yapıyor, bu yüzden teknik olarak gerçekten mümkün.
hanspeide

@lan sorununuzu nasıl çözdüğünüzü lütfen bilgilerinizi paylaşır mısınız
nida

merhaba çözümün var mı?
ask4solutions

Yanıtlar:


34

Sanırım logcat çıktısını kullanabilir ve analiz edebiliriz.

Tüm benzer programlarda bu izni buldum:

android.permission.READ_LOGS

Bu, hepsinin onu kullandığı anlamına geliyor, ancak program başlıyor gibi görünüyor ve bundan sonra programımız (uygulama koruyucusu) başlayacak ve öne çıkacak.

Aşağıdaki kodu kullanın:

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();
    }

Ve izinlerini Manifest dosyasına eklemeyi unutmayın.


lütfen, bu kodu nereye koymalıyız? bir hizmette mi? onStartCommand () içinde?
haythem souissi

57
JellyBean ve üzeri sürümlerde çalışmayacaktır. READ_LOGS izni artık yalnızca sistem uygulamaları için ayrılmıştır.
Ran

5
Bundan kesinlikle emin misin? Çünkü Smart AppLock bunu JB cihazlarda bile yapabiliyor gibi görünüyor. Bunun nedeni uygulamanın kendisini Aygıt Yöneticisi durumuna yükseltmesi mi? play.google.com/store/apps/…
Karthik Balakrishnan

1
@Torcellite, bu uygulama "Çalışan görevleri alma" iznine sahip, bu nedenle onun yerine o tekniği kullanıyor olabilir.
Sam

1
@Ran peki şimdi kullanmak için ne yapmalı ... jöle fasulyesinin üzerinde olmam gerektiğinden, soruda belirtilen sorunu çözmek için şimdi bir çözüm var mı ... lütfen en kısa
sürede

19

Bunu yapmanın hileli bir yolu, kontrol eden zamanlanmış bir döngüye sahip bir hizmettir.

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

Telefonda neyin çalıştığına bakmak için bu listeyi gözden geçirirsiniz. Artık bunları kimlikler ve processName ile tanımlayabilirsiniz, bu nedenle standart etkinlik için bu, hepsini durdurmadığınız sürece özel olanlar için kolaydır.

Not: Bu aslında ekranda olanların bir listesi değil, sadece neyin çalıştığının bir listesi ... belki hedefinizi geçersiz kılıyor ama en azından bir şeyin ne zaman çalışmaya başladığını bileceksiniz ... arka planda olsa bile liste yapın.

Parola meselesi için, korumalı veya her neyse, bir uygulama bulduğunuzda aktivitenizi başlatabilirsiniz.


uygulamanın başlatıldığı / devam ettirildiği zamanı öğrenmek mümkün müdür?
0LLiena

4
Android L'de android.app.usagebunun yerine paketi kullanın. developer.android.com/reference/android/app/usage/…
Plo_Koon

12

Bunun mümkün olmadığını düşünüyorum ve umuyorum. Bu tür işlevlerin kötü amaçlı yazılımlar tarafından ne kadar kolay kötüye kullanılabileceğini düşünün. Size yöneltilen amaçları ve yayınlananları dinleyebilirsiniz, ancak uygulama başlatma bir yayın etkinliği olmamalıdır.

Yapabilecekleriniz, başlatıcıyı değiştirmektir . Kullanıcı kabul ederse.


1
Neden mümkün olmasın? Bu benim cihazım ve ne çalışacağına ben karar veririm. Bu, rutin olarak verdiğimiz diğer izinlerden daha nasıl bir sorun olur? Bir yedek başlatıcı, yalnızca doğrudan kendisi tarafından başlatılan tüm uygulamaların başlatılmasını yakalayamaz. Bu ve SO hakkında, basitçe niyetlerin geçtiğini görebilmenin büyük bir sorun olacağını iddia eden birçok yorum var, ancak kimse sorunun ne olduğunu ve neden mevcut ayrıcalık sisteminin yapamayacağı kadar çirkin görülmesi gerektiğini açıklamıyor. ne olduğunu kullanıcıya açıklamak için kullanılabilir.
Kevin Whitefoot

Muhtemel izinler giderken, bu bir felaket. Bir güvenlik modeline sahip olmanın amacı, çoğu (ideal olarak tüm) istismarları önlerken, çoğu yasal kullanım durumunu mümkün kılmaktır. Korunması gereken sadece siz değil (muhtemelen bilgili bir kullanıcı), aynı zamanda uygulamaları yükleyen tecrübesiz kullanıcılar ve başka bir saldırı vektörünü düşünmek zorunda kalmayan uygulama yazarları. Tüm güvenlik, ödünleşmedir: bu durumda, kamu hizmeti ve güç ile muazzam sömürülebilirlik arasında. Kendiniz için gerçekten bu derece özgürlüğü istiyorsanız, Android yığınını klonlamakta ve kendi sisteminizi kodlamakta özgürsünüz.
Pontus Gagge

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();
    }
}

Mevcut çalışmayı alabilir Activityve bunun uygulamaya Activitykarşılık gelip gelmediğini kontrol edebilirsiniz Email.

Run CheckRunningActivity Threadüzerinde Applicationstart (ya da cihaz açılışta).

new CheckRunningActivity().start();

Güncelleme: Bu sınıfın android.permission.GET_TASKSizne ihtiyacı var , bu nedenle Manifest'e sonraki satırı ekleyin:

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

Bu yaklaşımı kullanıyorum ancak bu, döngü nedeniyle "// etkinliğinizi burada PACKAGE_NAME.ACTIVITY_NAME üzerinde tekrar tekrar gösterecek" açacaktır. Bunun için herhangi bir çözüm var mı?
Anuj Sharma

İstediğiniz sonucu aldığınızda CheckRunningActivity iş parçacığını durdurun
Veaceslav Gaidarji

Cevabınız için teşekkürler, o zaman bu ileti dizisi nasıl / ne zaman yeniden başlatılır? Yapışkan Hizmet kullanıyorum.
Anuj Sharma

sorunun bağlamına bağlıdır, lütfen ne elde etmek istediğinizi daha ayrıntılı olarak açıklayın.
Veaceslav Gaidarji

2
Buradaki kodunuzda Looper.loop()ifade, while(true)döngü asla bitmediği için asla çalıştırılmayacak gibi görünüyor . Bu bir hata mı?
Sam

11

Ana sorun, Başlatıcı (ana ekran) tipik olarak açık amaçlar kullandığında örtük amaçları dinlemeye çalışmanızdır.

Örtük bir amaç, "Biri bu videoyu oynat" demek istediğinizde ve Android'in bu amacı gerçekleştirebilecek bir uygulama seçmesidir.

Açık bir niyet, ana ekrandaki "E-posta" simgesini tıkladığınızda olan şeydir. Özellikle Android'e söz konusu uygulamayı tam olarak nitelenmiş adla (yani com.android.mail veya başka bir şey) açmasını söylüyor.

AFAIK'in bu tür açık niyetleri engellemesinin bir yolu yoktur. İki Etkinliğin aynı tam nitelikli paket adına sahip olamayacağı, Android'de yerleşik bir güvenlik önlemidir. Bu, üçüncü bir tarafın uygulamayı klonlamasını ve bu uygulama gibi görünmesini engeller. Yapmak istediğiniz şey mümkün olsaydı, teorik olarak rakiplerinizin tüm uygulamalarının çalışmasını engelleyebilecek bir uygulama yükleyebilirsiniz.

Yapmaya çalıştığınız şey Android güvenlik modeline aykırı.

Yapabileceğiniz bir şey, amaçları güvenlik sisteminize iletmek için belirli uygulama geliştiricileriyle ortak olmaktır, ancak bu muhtemelen uğraşmak isteyeceğiniz bir şey değildir.


6

getRunningTasks() Android L'de kullanımdan kaldırılmıştır.

Uygulama kullanım istatistiklerini elde etmek için android.app.usage paketinden UsageStats sınıfını kullanabilirsiniz .

Yeni Uygulama kullanım istatistikleri API'si, uygulama geliştiricilerin uygulamaların kullanımıyla ilgili istatistikleri toplamasına olanak tanır. Bu API, kullanımdan kaldırılmış getRecentTasks () yönteminden daha ayrıntılı kullanım bilgileri sağlar.

Bu API'yi kullanmak için, önce bildiriminizde android.permission.PACKAGE_USAGE_STATSizni beyan etmeniz gerekir . Kullanıcı ayrıca aracılığıyla bu uygulamaya erişimi etkinleştirmelidir Settings > Security > Apps with usage access.

Aşağıda , kullanıcıların uygulamaların kullanımıyla ilgili istatistikleri toplamasına izin vermek için Uygulama kullanım istatistikleri API'sinin nasıl kullanılacağını gösteren temel bir uygulama örneği verilmiştir.


Kullanım istatistikleri hangi uygulamanın ön planda olduğunu bilmeye nasıl yardımcı olabilir?
Ajay

3

Belki de bir servise ihtiyacınız var, arka planda sürekli çalışacak bir şeye. Hizmetin dediğini yapsın. Android.intent.action.MAIN dosyasını android.intent.category.LAUNCHER kategorisiyle de dinleyin. Ardından yayın alıcısının onReceive yöntemini geçersiz kılmasını sağlayın ve uygulamanın adını vb. Görmek için kontrol edin.


2
Bu sadece düşündüğüm yönteme benziyor, ancak temel bir BroadcastReceiver ile MAIN (cat. LAUNCHER) yayınını almakta zorlanıyorum. Bunu daha önce yapmayı başaran oldu mu? Bu aşamada, sadece bir uygulamanın başlatıldığını veya devam ettirildiğini tespit etmeye çalışıyorum. Daha sonra paket adını aradığım adları içeren bir dizeyle karşılaştırabilirim.
Ian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.