2017-04-06 100 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權限並處理運行時權限... –