بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

همه ابزارهای اندرویدی IMEI دارن؟

مدیریت گفتگو
Reza AF 12 سال پیش
آخرین تغییر: 12 سال پیش

با سلام

من نیاز دارم تا یک مشخصه یونیک از ابزارهای اندرویدی که برنامه من رو نصب میکنن داشته باشم، چیزی که به ذهنم رسید IMEI بود. حالا میخاستم بدونم همه ابزارهای اندرویدی، این شماره رو دارن؟ مثلا تبلتهای بدون سیم کارت و خلاصه همه ؟!

و اینکه آیا باید از همین استفاده کنم؟ یا چیز دیگه ای هم هست که بشه ازش استفاده کرد.

من میخام یکسری اطلاعات از کاربرام روی سرور ذخیره کنم، البته هر گوشی فقط یکبار حق ثبت داره.

نظرات

hamidd 12 سال پیش
فقط دستگاه هایی که سیم کارت می خورن IMEI دارن.تبلتهایی که سیم کارت نمیخورن IMEI ندارن مثل این که.
نورحسینی 12 سال پیش
رفتی سراغشا!! من فکر نمیکنم ربطی به سیم کارت داشته باشه ولی مطمین نیستم.
Reza AF 12 سال پیش
درخواست کاربران زیاد بود! خب از چه روشی میشه استفاده کرد که همه ابزارها داشته باشن؟
Reza AF 12 سال پیش
البته کار من اونقدر حیاتی نیست که بخام خیلی امنیتی کار کنم، من فقط یک شناسه میخام که روی همه ایراها باشه و بصورت یکتا هم باشه که بشه با اون شناسه کاربر رو شناسایی کرد
حامد 12 سال پیش
آدرس سخت افزار بلوتوث در هر دستگاهی بهترینه .... در همه دستگاه ها وجود داره و کاملا منحصر بفرده و با آپدیت سیستم عامل یا ریست فکتوری ... تغییر نمیکنه : لینک
Reza AF 12 سال پیش
بله آقای حسین زاده، برنامه یکسری اطلاعات میفرسته به سرور. درواقع یجور ثبت امتیاز کاربره، کاربر امتیاز خودش رو اراسل میکنه و میتونه امتیازات بقیه رو هم ببینه.امنیت مهم هست نه اونقدری که مثلا تراکنش بانکی انجام بشه. درحد همین ثبت امتیاز بازی! حامد جان دستگاههایی که بلوتوث ندارن چی؟
دیگه میزان امنیتش با خودت. برای هر کاربر میتونی یه گاید از سرور بگیری و تو برنامت ذخیره کنی. 100% یکتا و بی دردسر
Reza AF 12 سال پیش
خب در اینصورت مشکل پیش میاد، اونم اینکه اگه کاربر یکبار برنامه رو حذف کنه، دیگه اطلاعاتش روی سرور قابل دسترسی نیست
Reza AF 12 سال پیش
البته مشکل بزرگتری هم هست، اونم اینکه اصلا نمیدونم اینی که شما گفتین چی هست! فقط حدس زدم که مثلا خودم از سرور بهش یک آی دی اختصاص بدم! همینه؟
Reza AF 12 سال پیش
و یه چیز دیگه، اگه همون چیزی باشه که من حدس میزنم، احتمالا سمت سرور کلی کد باید بنویسم که متاسفانه من اصلا php بلد نیستم فقط درحد کدهایی که استاد اموزش دادن بلدم.
حامد 12 سال پیش
یه دستگاه نام ببر بلوتوث نداشته باشه
globally unique identifier لینک رشته ای یکتا. تا زمانی که فایل این رشته پاک نشده باشه مشکلی وجود نداره.
mohamedx6 12 سال پیش
بعضی از تبلت ها مثل smart touch بلوتوث ندارند البته اینقدر دستگاه های بدون بلوتوث کم هستن که کالعدم حساب کنید بهترن
Reza AF 12 سال پیش
تقریبا اکثر تبلتهای ارزون قیمت بازار بلوتوث ندارن
حامد 12 سال پیش
مطمئن هستی که ابلت های ارزون قیمت بلوتوث ندارند ... چون من خودم یه تبلت ارزان قیمت هیوندای خریدم و قبل از خرید این تبلت تمام تبلت های ارزون قیمت را بررسی کردم .... تا اونجایی که من تا تبلت های 200 هزار تومانی دیدم همشون بلوتوث و وای فای داشتند ..حالا زیر 200 هزار تومانی را دیگه ندیدم
حامد 12 سال پیش
ببخشید تا 300 هزار تومان منظورم بود
Reza AF 12 سال پیش
من قبلا اکستروم داشتم که بلوتوث نداشت، بعدشم آینول داشتم که اونم نداشت، الان یه ایسوس دارم که این داره!

پاسخ‌ها 2

SaM MP 12 سال پیش

این متود که خروجیش یک String هست رو میتونی در  اولین اجرای برنامت استفاده کنی.

طریقه ی کارش این طور هست که بعد از چک کردن androidId , deviceId برای بدست آوردن یک device_id انحصاری برای گوشی کاربر و در نظر گرفتن باگهای موجود در این رابطه در نهایت به صورت تصادفی خودش یک آیدی میسازه و اون رو در یک device_id.xml ذخیره میکنه. این رو هم در نظر داشته باشید که درصد خیلی کمی از کاربران کارشون به device_id تصادفی میرسه (احتمالا امولیتور یا تب لیت)

برای دفعات بعدی ورود به برنامه فقط کافیه که device_id ساخته شده در فایل device_id.xml رو فراخوانی کنی :)

میتونی با تغییرات اندکی device_id رو به عنوان Prefs هم ذخیره کنی.

 public static String uuid() {
    final String PREFS_FILE = "device_id.xml";
final String PREFS_DEVICE_ID = "device_id";
UUID uuid = null;

final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE, 0);
final String id = prefs.getString(PREFS_DEVICE_ID, null);

if (id != null) {
uuid = UUID.fromString(id);
return uuid.toString();
} else {
final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
try {
if ((androidId != null) && androidId != "9774d56d682e549c") {
uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();
return uuid.toString();
} else {
final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
if (deviceId != null && deviceId != "0000000000000000") {
uuid = UUID.nameUUIDFromBytes(deviceId.getBytes("utf8"));
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();
return uuid.toString();
} else {
uuid = UUID.randomUUID();
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();
return uuid.toString();
}
}
}
catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}

Permission:

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

نظرات

اگه بنا به ذخیره تو فایل باشه که گرفتن گاید از سرور بی دردسر تره!
SaM MP 12 سال پیش
میشه به صورت یک String در preferences ذخیره کرد اشاره کردم، تازه این متود برای هر نصب فقط یک بار اجرا میشه
preferences هم یه فایله. فقط گوشی روت نشده بهش دسترسی نداره. - اون متد هم یکبار اجرا میشه، کلا بحث اینه که مقدار یا هر بار محاسبه بشه که قابل جعل نباشه یا ذخیره میشه که قابل جعل هست. حالا مقدار ذخیره شده تو فایل از کجا بیاد دیگه تفاوتی نداره. پس ارزش محاسبه شدن هم نداره
Reza AF 12 سال پیش
این کد همیشه بک خروجی داره؟ یعنی اگه کاربر برنامه رو حذف کنه و دوباره نصب کنه بازم همون رشته قبلی رو تولید میکنه؟
SaM MP 12 سال پیش
تنها مشکلش همینه که مهندس گفتن، کاربر به xml ذخیره شده دسترسی پیدا کنه و تغییراتی توش بده
SaM MP 12 سال پیش
میشه این کاید رو یه توضیحی بدید، بلاخره به بهترین و امنترین روش برسیم تو خیلی از برنامه ها لازم میشه، مال منم یک روش پیشنهادی بود
این مد آخرین قسمتش کد رندومه. دو بار به اینجا برسه 2 تا خروجی متفاوت میده. GUID رو هم بالا توضیح دادم
SaM MP 12 سال پیش
بله درسته احتمالا در امولیتور و یا تب لیت کارش به راندوم برسه که در این صورت با پاک شدن xml قابل تغییر هست(در اصل دلیل ذخیره در xml هم همین مرحله سومش هست)، برای بقیه حتما یکتاست
مجتبی یگانه 12 سال پیش

دوستان به نظرتون این چطوره ؟

یک شناسه ی واحد از دستگاه بدست بیاریم (1)   بدیم به سرور ، سرور md5 کنه (که اگه شناسه یونیک باشه ، خروجی هم یونیک میشه ) بعد با یک الگوریتم سمت سرور یکم کد رو کامل تر کنیم ، مثلا اضافه کردن یک رشته ی 10 کارکتری تصادفی به md5 و در نظر گرفتن به عنوان کلید

1 - اینجا دیگه نیازی نیست بگیم شناسه  فقط imei - سریال بلوتوث یا ... ، یه تابع تعریف می کنیم ، اولویت بندی می کنیم ، میگیم :

  1. سریال بلوتوث
  2. imei دستگاه
  3. Android ID
  4.  Mac Address
  5. شماره تماس کاربر
  6. ایمیل کاربر 

اینم میشه کد php

<?php
	function generateRandomString($length = 10) {
		$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		$randomString = '';
		for ($i = 0; $i < $length; $i++) {
			$randomString .= $characters[rand(0, strlen($characters) - 1)];
		}
		return $randomString;
	}
	$key = "9774d56d682e549c";
	$hash = md5($key);
	$FinalKey=$hash.generateRandomString();
	echo $FinalKey;
	// Save FinalKey To DB (Maybe Check if Not Exist !)

متغییر key کلیدی هست که از Android اومده :)

با اجرای مجدد می بینید که فقط 10 کارکتر آخر متغییر هست (چون رندم تولید میشه ) پس ما باید قبل از ادامه ی عملیات (یعنی تولید قسمت رندم) برسی کنیم ببینیم کدی داریم که با اون مقدار شروع بشه یا نه 

روش که زیاده ، یه نمونه کد گذاشتم که تو تولید مقدار ها مشکلی نداشته باشید

نظرات

SaM MP 12 سال پیش
روش جالبیه ممنون، فقط اینجا بحث روی مرحله اول یعنی گرفتن شناسه واحد از دستگاه هست، این که اولویت بندی کردی فکر خوبیه نمیدونم دستگاهی پیدا میشه که از این متود در بره یا نه :))
مجتبی یگانه 12 سال پیش
خواهش میکنم :) - اولویت بندی من همین جوری بود ، حالا میشه بر اساس درصد احتمال وجود این مقدار اونها رو درست تر اولویت بندی کرد ، اما برای کارهای ساده ، فکر کنم Mac Address گزینه ی مناسبی باشه ، لینک T کمتر دستگاهی پیدا میشه که شبکه نداشته باشه ، یعنی نه سیم کارت بخوره ، نه وای فای داشته باشه ، حتی اگه نداشته باشه ، میشه بریم سمت بلوتوث ، به هر حال تولید کد واحد اونقدر ها هم سخت نیست :)
وقتی متد مشخصی برای تولید شناسه نداری پس مجبوری شناسه رو ذخیره کنی. گرفتن این مقادیر ارسالشون به سرور - هش کردن - جمع تعریف شده با یه رشته ، تا اینجاش پردازش اضافس. خروجی همون کاری رو نهایتا برات میکنه که یه گاید انجام میده
override 12 سال پیش
یه سوال : اگه هشی که تولید شده یونیک باشه که هست ، چون موارد که در 1 ذکر شدن همشون منحصر به فرد هستند - پس دیگه اون 10 کاراکتری که تصادفی تولید و به کد اضافه شدن برای چیه؟
override 12 سال پیش
بعد چرا اصلاً باید هش بشه ؟ برای اینکه همه ی کلید ها از لحاظ فرمت یکی باشند؟
Reza AF 12 سال پیش
آقای حسین زاده برای استفاده از گاید من باید اول گاید رو از سرور بگیرم و هم توی سرور و هم تو گوشی ذخیره کنم ، ازون به بعد با او شناسه با سرور ارتباط بگیرم، درسته؟
Spirit 12 سال پیش
منظور از گاید چیه؟ همون guide خودمونه؟ یا چیز دیگه ایه؟

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .