2014-01-17 61 views
4

无论何时在设备上完成新安装,我们都会尝试使用某种可在实体店中兑换的优惠券进行奖励。我们对此做了一些试验,并验证它是基于IMEI & IMSI的新设备。但是我们发现人们在一些可以操纵这些ID并模仿新设备的模拟器上执行此操作。这怎么可以避免?什么是最好的方式来找出一个Android设备是真实的?

目前,我们正在使用这样

TelephonyManager m_telephonyManager = (TelephonyManager) context.getSystemService(serviceName); 
    String IMEI, IMSI; 
    IMEI = m_telephonyManager.getDeviceId(); 
    IMSI = m_telephonyManager.getSubscriberId(); 
    return IMEI + ":" + IMSI; 

我相信,有一种方法,因为它的驱动安装正确的广告联盟,每个设备属性它只有一次。

+2

'ID可以被操纵 - 即使你使用IMEI的代码可以被操纵,黑客可以改变它从外部文件加载ID。 – marcinj

+0

广告网络还具有可以跟踪的连接和其他因素的IP。即使他们会有一些误报。 – zapl

+1

关于[如何检测Android应用程序在模拟器中运行?]的各种答案?(http://stackoverflow.com/questions/2799097/how-can-i-detect-when-an-android-application-是运行的,在最模拟器?answertab = votes#tab-top)和[如何从代码中发现我的Android应用程序是否在仿真器或真实设备上运行?](http://stackoverflow.com/questions/6864251/how-to-find-out-from -code-IF-MY-Android的应用程序 - 运行 - 在仿真器,或实时的设备)。让我们知道这些解决方案是否都不起作用,以防万一您正在寻找不同的东西:) –

回答

0

让他们在商店中的设备上显示应用+生成的代码。这似乎是你目前的方案可以防水的唯一方法。或者只是不要使用设备ID作为标识,但要找出其他一些促销方案;)

2

您可以使用这些方法中的任何一种来检查您的应用程序是否正在模拟器中运行。但这些并不是100%可靠的,但这些方法的组合可能会帮助你更好。

方法1

if (android.os.Build.MODEL.equals(“sdk”)) { 
    // emulator 
} else { 
    //not emulator 
} 

方法2

尝试设置您的清单有一些硬件这是不正常的仿真器支持的依赖。例如:

<uses-feature android:name="android.hardware.sensor.accelerometer" 
       android:required="true" /> 

方法3

尝试使用

Build.FINGERPRINT.contains("generic") 

这些发现应用程序是否在模拟器中运行某些方面。希望这可以帮助。

0

这不是您的问题的答案,而是一个关于如何获得唯一ID的建议。使用用户手机号码作为唯一ID。 的问题是,得到的电话号码是不平凡的作为可以在这里看到:

MSISDN : Is it a SIM Card Data? Why all The Provided Function (from Blackberry and Android) to fetch MSISDN not reliable?

因此,你可以做的是实现一个基本的握手过程,通过用户输入自己的手机号码,这是发送到您的服务器。您的服务器然后发送一条短信给您的应用程序可以收听的给定号码。一旦收到确认文本,就会将成功消息发送回服务器,并且您知道该电话号码是有效且唯一的。

希望这是有道理的,所有与您的项目最好。

相关问题