بهترین روش برای شناسه منحصر به فرد؟(حل شد)
با سلام خدمت دوستان :
لطفا کسانی جواب بدهند که در این زمینه تجربه بیشتری دارند :
با توجه به این که مک آدرس یا سریال نامبر گوشی پیشنهاد نمیشه برای گرفتن یه شناسه منحصر به فرد چه کاری اصولی تر هستش و امنیتش بالاتر هستش در هر گوشی؟
این راه پیشنهادی خود گوگل هستش :
String unigueID = UUID.randomUUID().toString().repalaceAll("-","");
خوب این هر بار که برنامه اجرا میشه یه آیدی جدید میسازه . ما چه جاهای می تونیم ازش استفاده کنیم وقتی هر بار تغییر می کنه؟ و چه پیشنهادهای دارید که بشه یه گوشی رو تشخیص داد که آیدی منحصر به فرد دارد ؟
https://developer.android.com/training/articles/user-data-ids.html#use_appropriate_identifiers

برای قسمت دوم سوال که برنامه نصب هست یا نه
private boolean isPackageInstalled(String packagename, PackageManager packageManager) { try { packageManager.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES); return true; } catch (NameNotFoundException e) { return false; } }

استفاده از UUID در شکل بالا کابرد های دیگه ایی داره ، از اونجایی که احتمال ایجاد دو مقدار مشابه واقعا ناچیز و نزدیک به صفر هست میشه گفت هیچوقت دو مقدار تکراری ایجاد نمیشه
ولی برای گرفتن یک کد یونیک میتونید به شکل زیر استفاده کنید : (همچنین با توجه به آموزش استاد در بخش گرفتن اطلاعات دیوایس میتونید پارامترهای دیگری رو هم به زیر اضاف کنید)
public static String getUUID() {
TelephonyManager telephonyManager = (TelephonyManager) G.context.getSystemService(Context.TELEPHONY_SERVICE);
WifiManager manager = (WifiManager) G.context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String macAddress = info.getMacAddress();
String imei = telephonyManager.getDeviceId();
String androidID = Secure.getString(G.context.getContentResolver(), Secure.ANDROID_ID);
return imei + "-" + macAddress + "-" + androidID;
}

کریس عزیز نمی تونم پایین تر از اندروید ۶ بگیرم متاسفانه . حالا به نظرت بازار از همین UUID استفاده کرده؟ من اگر clear data کنم اون شناسه دستگاه عوض میشه و یا اپ رو حذف کنم و دوباره نصب کنم. احتمالا همین UUID استفاده شده و در یک SharedPreferences ذخیره میشه . ولی بازهم بازار یا دیجی کالا تو اندروید ۶ به بعد هم اجازه دسترسی نمی گیرند . پس از کجا می فهمن گوشی کی بوده!!!

همون راهی که خودتون در بالا گفتید بهترین راه هست به نظر من.
قبلا توی یک پروژه آنلاین این کار رو انجام دادم و خودم به صورت رندم یک عدد 10 رقمی تولید میکردم.(البته به دلایلی توی سرور این کار رو انجام میدادم)
میتونید به صورت زیر عمل کنید که مشکل ساز نشه:
if (G.preferences.getBoolean ("running_first", true)) {
// تولید کد در صورت اولین اجرای برنامه و ذخیره سازی آن در Preferences
String unigueID = UUID.randomUUID().toString().repalaceAll("-","");
SharedPreferences.Editor editor = G.preferences.edit();
editor.putString("UUID", unigueID);
editor.commit();
}
بهترین کار این هست که این رو در اولین فایل اجرایی برنامتون مثل کلاس G و یا نهایتا در اولین اکتیویتی قرار بدید.

به همون روشی که گفتید برایِ هرکس در اولین اجرا یک رشته منحصر به فرد تولید میکنید و این مقدار رو داخلِ گوشی و همچنین سرور ذخیره میکنید. از این به بعد برای شناساییِ کاربر میتونید از این رشته استفاده کنید.
اما طبیعیه که اگه clean بشه رشته از رویِ دستگاه پاک میشه ولی داخلِ سرور باقی میمونه. برایِ اینکه اگه کاربر برنامه رو پاک کرد اطلاعات از بین نره همراه با رشته منحصر به فرد بایستی mac address (یا ایمیل کاربر یا هر رشته منحصر به فرد دیگه) رو هم به سرور بفرستید و داخلِ دیتابیس ذخیره کنید. حالا هروقت کاربر دوباره برنامه رو نصب کرد ابتدا چک میکنید که آیا این مک آدرس داخلِ دیتابیس هست یا نه؟ اگه بود اون رشته قبلی رو براش در نظر میگیرید.
اگه دوست ندارید از سرور استفاده کنید یا از خودِ mac address. میتونید رویِ mac add یه تغییری بدید که فقط خودتون میدونید. مثلا ابتدا و وسط و انتهایِ آدرس چیزی اضافه کنید. یا مقدارِ کاراکترِ هر حرف رو بگیرید تبدیل به عدد کنید و مقداری به اون اضافه کنید، سپس دوباره به کاراکتر تبدیل کنید. به این شکل مثلا a میشه c. یا 9 میشه ; و....

من از این روش استفاده کردم خوشحال میشم نظرتون بدونم
Boolean isFirstRun = G.preferences.getBoolean("FIRST_TIME", true);
if (isFirstRun) {
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String serialIMEI = telephonyManager.getDeviceId();
String UUID = Common.getGenerateUUID();
if (serialIMEI == AppConfig.baseDevice || serialIMEI == null) {
int min = 1;
int max = 2100000000;//
Random random = new Random();
int randonSerialIMEI = random.nextInt(max - min + 1) + min;
if (serialIMEI == null) {
serialIMEI = randonSerialIMEI + "";
} else {
serialIMEI = serialIMEI + String.valueOf(randonSerialIMEI);
}
G.editor.putString("IMEA_KEY_APP", serialIMEI);
G.IMEI = serialIMEI;
} else {
G.editor.putString("IMEA_KEY_APP", serialIMEI);
G.IMEI = serialIMEI;
}
G.editor.putString("UUID_KEY_APP", UUID);
G.UUID = UUID;
G.editor.putBoolean("FIRST_TIME", false);
G.editor.commit();
} else {
G.IMEI = G.preferences.getString("IMEA_KEY_APP", null);
G.UUID = G.preferences.getString("UUID_KEY_APP", null);
G.editor.commit();
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .