2017-04-06 65 views
0

是否可以将Android APP锁定为仅与特定设备配合使用(如具有特定ID/imei /令牌的手机中),并防止任何人使用该应用并在任何设备上使用该应用其他设备?将Android APP锁定到特定设备

是否有可能在代码中对设备标记进行硬编码(或将其加密存储),并检查它是否与当前运行的设备标记匹配并关闭(或显示错误),如果它们不相同? Android设备令牌甚至可以用于此?它是否与硬件链接(即使在刷新ROM之后,独特的设备始终具有相同的标记)?

谢谢!

回答

1

是的,这将工作。

你需要调用android.telephony.TelephonyManager.getDeviceId();

这将返回的任何字符串唯一标识设备(IMEI上GSM,MEID为CDMA)。

你需要以下权限在AndroidManifest.xml中:

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

才能做到这一点。

然后,您可以检查IMEI在MainActivity的onCreate()目标设备相匹配,并且如果没有,请致电finish();

可以使用Facebook的“隐藏”库加密目标的IMEI,例如。

+0

任何方式的用户可以绕过它以任何方式吗?设备是否可以更改?我想即使它可能他们将不得不知道确切deviceId,将使应用程序工作... – laurentius

+0

用户将需要相当复杂。在“根源”电话上,用户可以更改IMEI。该应用程序可以被反向设计以提取允许应用程序运行的deviceId。但正如我所说的,用户必须知道如何对APK进行反向工程,因此检查肯定会阻止“普通”用户非法使用该应用。 –

1

是的,我们能做到这一点,但我们必须处理这件事情如下过程: 1)我们可以通过这个代码得到的Android ID或设备的IMEI:

String imei; 
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
      if(isSimSupport(mContext)) 
      { 
       imei = telephonyManager.getDeviceId(); 
      } 
      if(imei.equalsIgnoreCase("")) 
      { 
       imei= Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); 
      } 
      if (isNetworkAvailable()) { 
       String userId=preference.getUserId("UserId"); 
       String devicetoken=preference.getToken("token"); 
       sendRegistrationToServer(imei,userId,devicetoken); 
      } else { 
       toastMsg(getResources().getString(R.string.internet_alert)); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

检查该IMEI值时启动应用程序,如果它匹配,那么就exitfrom 应用代码:

protected void exitFromApp() { 
     finish(); 
     Intent localIntent = new Intent("android.intent.action.MAIN"); 
     localIntent.addCategory("android.intent.category.HOME"); 
     localIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(localIntent); 
    } 

public static boolean isSimSupport(Context context) 
    { 
     TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     return !(tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT); 
    } 

为视图普通用户角度看来它不工作在该设备上。 这是一个窍门,但没有代码来阻止应用程序的运行或安装。

+1

在清单中添加READ_PHONE_STATE权限并处理运行时权限... –