⚠️ गोपनीयता और नीति चेतावनी
Android 10 (API 29) से: गैर-सिस्टम ऐप्स IMEI, सीरियल नंबर, या अन्य हार्डवेयर आइडेंटिफायर्स एक्सेस नहीं कर सकते। प्रयास करने पर SecurityException फेंका जाता है।
सर्वोत्तम अभ्यास: डिवाइस आइडेंटिफिकेशन के लिए अनरिसेटेबल पहचानकर्ता से बचें। इसके बजाय उपयोग करें:
- Firebase Installation ID (FID) - ऐप इंस्टेंस पहचान के लिए
- Advertising ID - विज्ञापन/एनालिटिक्स के लिए (उपयोगकर्ता रीसेट कर सकता है)
- UUID (ऐप-स्कोप्ड) - पहली बार ऐप चलने पर जनरेट करें, SharedPreferences में स्टोर करें
- Android ID (SSAID) -
Settings.Secure.ANDROID_ID, ऐप-स्कोप्ड (Android 8.0+)
आधुनिक दृष्टिकोण: ऐप-स्कोप्ड UUID
import android.content.Context;
import android.content.SharedPreferences;
import java.util.UUID;
public class DeviceIdManager {
private static final String PREFS_NAME = "device_id_prefs";
private static final String KEY_DEVICE_ID = "device_uuid";
private final SharedPreferences prefs;
public DeviceIdManager(Context context) {
prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
public String getDeviceId() {
String deviceId = prefs.getString(KEY_DEVICE_ID, null);
if (deviceId == null) {
deviceId = UUID.randomUUID().toString();
prefs.edit().putString(KEY_DEVICE_ID, deviceId).apply();
}
return deviceId;
}
public void resetDeviceId() {
prefs.edit().remove(KEY_DEVICE_ID).apply();
}
}
Android ID (SSAID) - API 26+
प्रति-ऐप, प्रति-उपयोगकर्ता यूनिक ID। ऐप अनइंस्टॉल पर रीसेट होता है।
import android.provider.Settings.Secure; String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); // उदाहरण: "a1b2c3d4e5f6g7h8" // नोट: Android 8.0+ में प्रत्येक ऐप के लिए अलग होता है
Advertising ID (Google Play Services)
// build.gradle
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
// उपयोग
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import java.io.IOException;
new Thread(() -> {
try {
AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context);
String advertisingId = adInfo.getId();
boolean isLimitAdTracking = adInfo.isLimitAdTrackingEnabled();
// advertisingId उपयोग करें
} catch (GooglePlayServicesNotAvailableException |
GooglePlayServicesRepairableException | IOException e) {
e.printStackTrace();
}
}).start();
Firebase Installation ID (FID)
// build.gradle
implementation 'com.google.firebase:firebase-installations:17.1.4'
// उपयोग
import com.google.firebase.installations.FirebaseInstallations;
FirebaseInstallations.getInstance().getId()
.addOnSuccessListener(fid -> {
// fid उपयोग करें - ऐप इंस्टेंस के लिए यूनिक
})
.addOnFailureListener(e -> {
// एरर हैंडलिंग
});
लीगेसी: IMEI एक्सेस (केवल Android 9 और नीचे, सिस्टम ऐप्स के लिए)
सामान्य ऐप्स के लिए काम नहीं करता Android 10+ पर।
// AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
// कोड (डिप्रिकेटेड/प्रतिबंधित)
import android.Manifest;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;
import androidx.core.app.ActivityCompat;
public void requestImei() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE}, 101);
return;
}
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// Android 10+ पर SecurityException फेंकेगा
String imei = tm.getImei(); // API 26+
// या पुराने API: tm.getDeviceId();
}
रनटाइम परमिशन हैंडलिंग
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 101) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// परमिशन मिली, लेकिन Android 10+ पर फिर भी IMEI एक्सेस नहीं होगा
requestImei();
} else {
// परमिशन अस्वीकृत
}
}
}
पहचानकर्ता तुलना
| पहचानकर्ता | स्कोप | रीसेटेबल | Android 10+ एक्सेस | उपयोग केस |
|---|---|---|---|---|
| IMEI/Serial | डिवाइस | नहीं | ❌ ब्लॉक्ड | नहीं उपयोग करें |
| Android ID (SSAID) | ऐप + उपयोगकर्ता | ऐप अनइंस्टॉल पर | ✅ (ऐप-स्कोप्ड) | सरल पहचान |
| Advertising ID | उपयोगकर्ता (प्रोफाइल) | हाँ (सेटिंग्स में) | ✅ (GMS जरूरी) | विज्ञापन/एनालिटिक्स |
| Firebase Install ID | ऐप इंस्टेंस | ऐप डेटा क्लियर पर | ✅ | बैकएंड पहचान |
| कस्टम UUID | ऐप इंस्टेंस | ऐप डेटा क्लियर पर | ✅ | सामान्य उद्देश्य |
सिफारिश
- बैकएंड पहचान: Firebase Installation ID या कस्टम UUID
- एनालिटिक्स/विज्ञापन: Advertising ID (उपयोगकर्ता सहमति के साथ)
- सरल स्थानीय पहचान: Android ID (SSAID)
- कभी नहीं: IMEI, सीरियल नंबर, MAC एड्रेस (प्रतिबंधित/गोपनीयता उल्लंघन)
नमूना: संयुक्त पहचानकर्ता प्रदाता
public class IdentifierProvider {
private final Context context;
private final DeviceIdManager uuidManager;
public IdentifierProvider(Context context) {
this.context = context;
this.uuidManager = new DeviceIdManager(context);
}
public String getPrimaryId() {
return uuidManager.getDeviceId(); // ऐप-स्कोप्ड UUID
}
public String getAndroidId() {
return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
}
public void getAdvertisingId(OnAdIdListener listener) {
new Thread(() -> {
try {
AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(context);
listener.onAdIdReceived(info.getId(), info.isLimitAdTrackingEnabled());
} catch (Exception e) {
listener.onAdIdError(e);
}
}).start();
}
public interface OnAdIdListener {
void onAdIdReceived(String adId, boolean limitAdTracking);
void onAdIdError(Exception e);
}
}