Saya mencoba mengembangkan aplikasi yang mencegah pengguna mendapatkan aplikasi tertentu tanpa kata sandi. Skenarionya adalah ...
- pengguna mengklik aplikasi "Email" (misalnya)
- aplikasi saya mendeteksi peluncuran aplikasi
- aplikasi saya mengonfirmasi bahwa ini adalah aplikasi "Email"
- aplikasi saya membuka tampilan di atas, meminta kata sandi
- pengguna memasukkan sandi, jika benar, aplikasi saya menghilang, meninggalkan aplikasi "Email" di atas
Saya baik-baik saja melakukan sisanya, hanya bagian 2 yang membuat saya bingung, dan setelah beberapa hari membaca Broadcast Intents dll dan mencoba mendengarkan "android.intent.action.MAIN" dll dalam proyek uji coba saya, saya tidak bisa sepertinya mendeteksi saat aplikasi selain milik saya dimulai.
Adakah yang bisa membantu? Apakah saya melakukannya dengan cara yang benar, dalam mencari aplikasi baru yang menyiarkan maksud untuk memulai, atau haruskah saya membaca log sistem untuk maksud baru, atau melakukan sesuatu dalam kode native?
Petunjuk apa pun akan membantu, bahkan jika Anda tidak dapat menjawabnya sepenuhnya, saya akan dapat melakukan lebih banyak penelitian. Terima kasih banyak. Ian
Jawaban:
Saya pikir kita dapat menggunakan
logcat
dan menganalisis keluarannya.Di semua program serupa, saya menemukan izin ini:
android.permission.READ_LOGS
Itu berarti mereka semua menggunakannya tetapi tampaknya program dimulai dan setelah itu program kami (pelindung aplikasi) akan mulai dan menampilkan.
Gunakan kode di bawah ini:
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(); }
Dan jangan lupa untuk menambahkan izinnya di file Manifest.
sumber
Cara menarik untuk melakukannya adalah memiliki layanan dengan loop berjangka waktu yang memeriksa
Anda menelusuri daftar itu untuk melihat apa yang sedang berjalan di telepon. Sekarang Anda dapat mengidentifikasinya dengan id dan processName, jadi untuk aktivitas standar ini mudah untuk aktivitas kustom dengan baik kecuali jika Anda menghentikan semuanya, sulit untuk membedakan ...
Catatan: ini bukan daftar apa yang sebenarnya ada di layar, hanya daftar apa yang sedang berjalan ... agak meniadakan tujuan Anda mungkin tetapi setidaknya Anda akan tahu ketika sesuatu mulai berjalan ... itu akan tetap seperti itu daftar bahkan ketika di latar belakang sekalipun.
Untuk kata sandi Anda bisa memulai aktivitas Anda ketika Anda menemukan aplikasi yang dilindungi atau apa pun.
sumber
android.app.usage
paket sebagai gantinya. developer.android.com/reference/android/app/usage/…Saya pikir dan berharap ini tidak mungkin. Pertimbangkan betapa mudahnya fungsionalitas tersebut dapat disalahgunakan oleh perangkat lunak berbahaya. Anda bisa mendengarkan maksud yang ditujukan kepada Anda, dan yang disiarkan, tetapi peluncuran aplikasi tidak boleh menjadi acara siaran.
Apa yang mungkin dapat Anda lakukan adalah mengganti peluncur . Jika pengguna menyetujuinya.
sumber
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(); } }
Anda dapat menjalankan saat ini
Activity
dan memeriksa apakah iniActivity
sesuai denganEmail
aplikasi.Jalankan
CheckRunningActivity
Thread
saatApplication
mulai (atau saat boot perangkat).new CheckRunningActivity().start();
Pembaruan: Kelas ini membutuhkan
android.permission.GET_TASKS
izin, jadi tambahkan baris berikutnya ke Manifes:<uses-permission android:name="android.permission.GET_TASKS" />
sumber
Looper.loop()
pernyataan tersebut sepertinya tidak akan pernah dijalankan karenawhile(true)
loop tidak pernah selesai. Apa ini salah?Masalah utamanya adalah Anda mencoba mendengarkan maksud implisit ketika Peluncur (layar utama) biasanya menggunakan maksud eksplisit.
Maksud implisit adalah saat Anda ingin mengatakan "Seseorang memutar video ini" dan Android memilih aplikasi yang bisa menangani maksud tersebut.
Maksud eksplisit adalah apa yang terjadi saat Anda mengklik ikon "Email" di layar beranda. Ini secara khusus memberi tahu Android untuk membuka aplikasi spesifik itu dengan nama yang sepenuhnya memenuhi syarat (yaitu com.android.mail atau sesuatu).
Tidak ada cara AFAIK untuk menghalangi maksud eksplisit seperti itu. Ini adalah ukuran keamanan bawaan Android sehingga tidak ada dua Aktivitas yang dapat memiliki nama paket yang sepenuhnya memenuhi syarat yang sama. Ini mencegah pihak ketiga mengkloning aplikasi dan menyamar sebagai aplikasi itu. Jika apa yang ingin Anda lakukan adalah mungkin, Anda secara teoritis dapat menginstal aplikasi yang dapat memblokir semua aplikasi pesaing Anda agar tidak berfungsi.
Apa yang Anda coba lakukan bertentangan dengan model keamanan Android.
Satu hal yang dapat Anda lakukan adalah bermitra dengan pengembang aplikasi tertentu untuk meneruskan maksud ke sistem keamanan Anda, tetapi itu mungkin bukan sesuatu yang ingin Anda tangani.
sumber
getRunningTasks()
tidak digunakan lagi di Android L.Untuk mendapatkan statistik penggunaan aplikasi Anda dapat menggunakan kelas UsageStats dari paket android.app.usage .
API statistik penggunaan Aplikasi baru memungkinkan pengembang aplikasi untuk mengumpulkan statistik terkait penggunaan aplikasi. API ini memberikan informasi penggunaan yang lebih detail daripada metode getRecentTasks () yang tidak digunakan lagi.
Untuk menggunakan API ini, Anda harus mendeklarasikan
android.permission.PACKAGE_USAGE_STATS
izin di manifes Anda terlebih dahulu . Pengguna juga harus mengaktifkan akses untuk aplikasi ini melaluiSettings > Security > Apps with usage access
.Berikut adalah contoh aplikasi dasar yang menunjukkan cara menggunakan API statistik penggunaan aplikasi untuk memungkinkan pengguna mengumpulkan statistik terkait penggunaan aplikasi.
sumber
Mungkin Anda memerlukan layanan, sesuatu yang akan terus berjalan di latar belakang. Dari pada meminta layanan Anda melakukan apa yang Anda katakan. Dengarkan android.intent.action.MAIN juga dengan kategori android.intent.category.LAUNCHER. Kemudian minta penerima siaran itu untuk mengganti metode onReceive dan lakukan pemeriksaan untuk melihat nama aplikasi, dll.
sumber