Saya perlu menggunakan ID unik untuk aplikasi Android dan saya pikir nomor seri untuk perangkat tersebut adalah kandidat yang baik. Bagaimana cara mengambil nomor seri perangkat Android di aplikasi saya?
115
Saya perlu menggunakan ID unik untuk aplikasi Android dan saya pikir nomor seri untuk perangkat tersebut adalah kandidat yang baik. Bagaimana cara mengambil nomor seri perangkat Android di aplikasi saya?
Jawaban:
getSystemService adalah metode dari kelas Aktivitas. getDeviceID () akan mengembalikan MDN atau MEID perangkat tergantung pada radio mana yang digunakan telepon (GSM atau CDMA).
Setiap perangkat HARUS mengembalikan nilai unik di sini (dengan asumsi itu adalah telepon). Ini seharusnya berfungsi untuk perangkat Android apa pun dengan slot sim atau radio CDMA. Anda sendirian dengan microwave bertenaga Android itu ;-)
sumber
Seperti yang disebutkan Dave Webb, Blog Pengembang Android memiliki artikel yang membahasnya.
Saya berbicara dengan seseorang di Google untuk mendapatkan klarifikasi tambahan tentang beberapa item. Inilah yang saya temukan yang TIDAK disebutkan dalam posting blog tersebut di atas:
Berdasarkan rekomendasi Google, saya mengimplementasikan kelas yang akan menghasilkan UUID unik untuk setiap perangkat, menggunakan ANDROID_ID sebagai seed jika sesuai, mengembalikan TelephonyManager.getDeviceId () seperlunya, dan jika gagal, beralih ke UUID unik yang dibuat secara acak yang tetap ada setelah aplikasi dimulai ulang (tetapi tidak untuk pemasangan ulang aplikasi).
sumber
Kode ini mengembalikan nomor seri perangkat menggunakan Android API tersembunyi.
sumber
Meskipun, tidak ada jaminan bahwa ID Android akan menjadi pengenal unik.
sumber
getContentResolver
adalah kembalinull
. Namun, mungkin bermanfaat saat membuka pertanyaan dan memposting kode Anda.Ada posting bagus di Blog Pengembang Android yang membahas hal ini .
Ini merekomendasikan untuk tidak menggunakan
TelephonyManager.getDeviceId()
karena tidak berfungsi pada perangkat Android yang bukan ponsel seperti tablet, ini memerlukanREAD_PHONE_STATE
izin dan tidak berfungsi dengan andal di semua ponsel.Sebagai gantinya, Anda dapat menggunakan salah satu dari berikut ini:
Posting ini membahas pro dan kontra masing-masing dan itu layak dibaca sehingga Anda dapat menentukan mana yang terbaik untuk Anda gunakan.
sumber
Untuk nomor sederhana yang unik untuk perangkat dan konstan selama masa pakainya (kecuali reset atau peretasan pabrik), gunakan Settings.Secure.ANDROID_ID .
Untuk menggunakan nomor seri perangkat (yang ditampilkan di "Pengaturan Sistem / Tentang / Status") jika tersedia dan kembali ke ID Android:
sumber
IMEI bagus tetapi hanya berfungsi pada perangkat Android dengan telepon. Anda harus mempertimbangkan dukungan untuk Tablet atau perangkat Android lainnya juga, yang tidak memiliki telepon.
Anda memiliki beberapa alternatif seperti: Membangun anggota kelas, BT MAC, WLAN MAC, atau bahkan lebih baik - kombinasi dari semua ini.
Saya telah menjelaskan detail ini dalam artikel di blog saya, lihat: http://www.pocketmagic.net/?p=1662
sumber
Karena tidak ada jawaban di sini yang menyebutkan ID sempurna dan tahan gagal yang PERSISTEN melalui pembaruan sistem dan ada di SEMUA perangkat (terutama karena fakta bahwa tidak ada solusi individual dari Google), saya memutuskan untuk memposting metode yang hal terbaik berikutnya dengan menggabungkan dua pengenal yang tersedia, dan pemeriksaan untuk memilih di antara keduanya pada saat proses.
Sebelum kode, 3 fakta:
TelephonyManager.getDeviceId()
(akaIMEI) tidak akan berfungsi dengan baik atau sama sekali untuk perangkat non-GSM, 3G, LTE, dll., tetapi akan selalu mengembalikan ID unik saat perangkat keras terkait ada , bahkan saat tidak ada SIM yang dimasukkan atau bahkan saat tidak ada slot SIM ( beberapa OEM telah melakukan ini).Karena Gingerbread (Android 2.3)
android.os.Build.SERIAL
harus ada di perangkat apa pun yang tidak menyediakan IMEI , yaitu tidak memiliki perangkat keras yang disebutkan di atas, sesuai dengan kebijakan Android.Karena fakta (2.), setidaknya satu dari dua pengenal unik ini akan SELALU hadir , dan SERIAL dapat hadir bersamaan dengan IMEI.
Catatan: Fakta (1.) dan (2.) didasarkan pada pernyataan Google
LARUTAN
Dengan fakta di atas, seseorang selalu dapat memiliki pengenal unik dengan memeriksa apakah ada perangkat keras yang terikat IMEI, dan kembali ke SERIAL jika tidak, karena seseorang tidak dapat memeriksa apakah SERIAL yang ada valid. Kelas statis berikut menyajikan 2 metode untuk memeriksa kehadiran tersebut dan menggunakan IMEI atau SERIAL:
Saya akan menyarankan penggunaan
getCleartextID_HARDCHECK
. Jika pantulan tidak menempel di lingkungan Anda, gunakangetCleartextID_SIMCHECK
metode ini, tetapi pertimbangkan bahwa itu harus disesuaikan dengan kebutuhan kehadiran SIM khusus Anda.NB : Harap diperhatikan bahwa OEM telah berhasil mengeluarkan SERIAL dari kebijakan Google (beberapa perangkat dengan SERIAL yang sama), dan Google seperti yang dinyatakan, setidaknya ada satu kasus yang diketahui dalam OEM besar (tidak diungkapkan dan saya tidak tahu merek mana itu baik, saya menebak Samsung).
Penafian : Ini menjawab pertanyaan asli tentang mendapatkan ID perangkat yang unik, tetapi OP memperkenalkan ambiguitas dengan menyatakan bahwa dia memerlukan ID unik untuk sebuah APP. Bahkan jika untuk skenario seperti itu Android_ID akan lebih baik, itu TIDAK AKAN BEKERJA setelah, katakanlah, Titanium Backup dari suatu aplikasi melalui 2 pemasangan ROM yang berbeda (bahkan dapat berupa ROM yang sama). Solusi saya mempertahankan ketekunan yang tidak tergantung pada flash atau reset pabrik, dan hanya akan gagal ketika gangguan IMEI atau SERIAL terjadi melalui peretasan / mod perangkat keras.
sumber
Ada masalah dengan semua pendekatan di atas. Di Google i / o Reto Meier merilis jawaban yang kuat tentang bagaimana mendekati ini yang harus memenuhi sebagian besar kebutuhan pengembang untuk melacak pengguna di seluruh instalasi.
Pendekatan ini akan memberi Anda ID pengguna anonim dan aman yang akan tetap ada untuk pengguna di berbagai perangkat (termasuk tablet, berdasarkan akun Google utama) dan di seluruh penginstalan pada perangkat yang sama. Pendekatan dasarnya adalah membuat ID pengguna acak dan menyimpannya di preferensi bersama aplikasi. Anda kemudian menggunakan agen cadangan Google untuk menyimpan preferensi bersama yang ditautkan ke akun Google di awan.
Mari kita lakukan pendekatan lengkap. Pertama kita perlu membuat cadangan untuk SharedPreferences menggunakan Android Backup Service. Mulailah dengan mendaftarkan aplikasi Anda melalui tautan ini: http://developer.android.com/google/backup/signup.html
Google akan memberi Anda kunci layanan cadangan yang perlu Anda tambahkan ke manifes. Anda juga perlu memberi tahu aplikasi untuk menggunakan BackupAgent sebagai berikut:
Kemudian Anda perlu membuat agen cadangan dan memintanya untuk menggunakan agen pembantu untuk sharedpreferences:
Untuk menyelesaikan pencadangan, Anda perlu membuat instance BackupManager di Aktivitas utama Anda:
Terakhir buat ID pengguna, jika belum ada, dan simpan di SharedPreferences:
User_ID ini sekarang akan tetap ada di seluruh penginstalan, meskipun pengguna berpindah perangkat.
Untuk informasi lebih lanjut tentang pendekatan ini, lihat pembicaraan Reto di sini http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html
Dan untuk detail lengkap tentang cara menerapkan agen cadangan, lihat situs pengembang di sini: http://developer.android.com/guide/topics/data/backup.html Saya sangat merekomendasikan bagian di bawah tentang pengujian seperti halnya cadangan tidak terjadi secara instan dan untuk menguji Anda harus memaksa cadangan.
sumber
Cara lain adalah menggunakan / sys / class / android_usb / android0 / iSerial di Aplikasi tanpa izin apa pun.
Untuk melakukan ini di java seseorang hanya akan menggunakan FileInputStream untuk membuka file iSerial dan membaca karakternya. Pastikan Anda membungkusnya dengan penangan pengecualian karena tidak semua perangkat memiliki file ini.
Setidaknya perangkat berikut diketahui memiliki file ini yang dapat dibaca dunia:
Anda juga dapat melihat posting blog saya di sini: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html tempat saya mendiskusikan file lain apa yang tersedia untuk info.
sumber
Seperti yang dikatakan @haserman:
Tapi itu perlu termasuk izin dalam file manifes:
sumber
ID perangkat unik Perangkat OS Android sebagai String.
tetapi saya sangat merekomendasikan metode ini yang disarankan oleh Google ::
Mengidentifikasi Penginstalan Aplikasi
sumber
Build.SERIAL
adalah cara termudah untuk melakukannya, meskipun tidak sepenuhnya dapat diandalkan karena dapat kosong atau terkadang mengembalikan nilai yang berbeda ( bukti 1 , bukti 2 ) dari yang dapat Anda lihat di pengaturan perangkat Anda.Ada beberapa cara untuk mendapatkan nomor itu tergantung pada pabrikan perangkat dan versi Android, jadi saya memutuskan untuk mengumpulkan setiap solusi yang mungkin saya temukan dalam satu inti . Berikut adalah versi yang disederhanakan:
sumber
Saya tahu pertanyaan ini sudah tua tetapi dapat dilakukan dalam satu baris kode
String deviceID = Build.SERIAL;
sumber
Saya menemukan kelas contoh yang diposting oleh @emmby di atas sebagai titik awal yang bagus. Tetapi ada beberapa kekurangan, seperti yang disebutkan oleh poster lain. Yang utama adalah ia mempertahankan UUID ke file XML secara tidak perlu dan setelah itu selalu mengambilnya dari file ini. Hal ini membuat kelas terbuka untuk peretasan yang mudah: siapa pun dengan ponsel yang di-rooting dapat mengedit file XML untuk membuat UUID baru.
Saya telah memperbarui kode sehingga hanya tetap ke XML jika benar-benar diperlukan (yaitu saat menggunakan UUID yang dibuat secara acak) dan memfaktorkan ulang logika sesuai jawaban @Brill Pappin:
sumber
Iya. Ini adalah nomor seri perangkat keras dan unik. Jadi pada api level 2.3 ke atas Anda bisa menggunakan android.os.Build.ANDROID_ID untuk mendapatkannya. Untuk level API di bawah 2.3, gunakan TelephonyManager.getDeviceID () .
Anda dapat membaca http://android-developers.blogspot.in/2011/03/identifying-app-installations.html
sumber