2014-12-18 2 views
4

Цель в этом контексте состоит в том, чтобы предотвратить ложные высокие баллы (мое приложение - игра) от сообщения в LeaderBoard. Это произошло для Flappy Birds - см. Эту ссылку - http://www.androidpit.com/forum/589832/flappy-bird-high-score-cheat-set-your-own-high-scoreКак предотвратить использование Android-телефонов с установленными приложениями?

Поскольку пользователь root может делать все, что он хочет, со своим мобильным телефоном, я полагаю, что ни одна другая работа не будет работать, и единственным решением является предотвращение установки корневых пользователей приложение. Я прав? Есть ли способ сделать это?

PS: Моя игра не требует подключения к Интернету всегда, поэтому сообщение о баллах как и когда это происходит с другим сервером, не является жизнеспособным. Высокие баллы сообщаются в таблицу лидеров только тогда, когда доступно подключение к Интернету.

ответ

11

У меня было аналогичное требование. Я не мог добиться того, чтобы приложения не должно быть установлено на устройстве корневых, но я использовал работу вокруг для этого:

  • Проверьте, если ваше устройство коренится в onResume вашей деятельности в.
  • Если его коренится, просто покажите ему предупреждение «Это устройство внедрено, вы не можете использовать это приложение» и выйти из приложения.

Пример:

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if(new DeviceUtils().isDeviceRooted(getApplicationContext())){ 
     showAlertDialogAndExitApp("This device is rooted. You can't use this app."); 
    } 
} 


public void showAlertDialogAndExitApp(String message) { 

    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); 
    alertDialog.setTitle("Alert"); 
    alertDialog.setMessage(message); 
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        Intent intent = new Intent(Intent.ACTION_MAIN); 
        intent.addCategory(Intent.CATEGORY_HOME); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(intent); 
        finish(); 
       } 
      }); 

    alertDialog.show(); 
} 

DeviceUtis.java был класс утилита, которая возвращается, если устройство укоренено или нет.

public class DeviceUtils { 

    public Boolean isDeviceRooted(Context context){ 
     boolean isRooted = isrooted1() || isrooted2(); 
     return isRooted; 
    } 

    private boolean isrooted1() { 

     File file = new File("/system/app/Superuser.apk"); 
     if (file.exists()) { 
      return true; 
     } 
     return false; 
    } 

    // try executing commands 
    private boolean isrooted2() { 
     return canExecuteCommand("/system/xbin/which su") 
       || canExecuteCommand("/system/bin/which su") 
       || canExecuteCommand("which su"); 
    } 
} 

Мы использовали 5 методов для тестирования, и я только что показал 2 здесь. Вы можете использовать любой из методов, которые вы найдете хорошо.

Надеюсь, что это поможет.

P.S: Я поставил этот вызов все действия onResume-х, как пользователь (с целью взлома) можно установить приложение, перейдите к какой-либо другой деятельности, а затем корневое устройство.

+1

Nicely объяснил спасибо ;-) –

+0

может у сказать, какие возможности есть для, прежде, чем установить приложение, как при установке приложения в андроид устройства, мы можем проверить, если устройство коренится или нет? – harikrishnan

+0

Но почему в onResume(), почему не в методе onCreate(), я думаю, это будет хорошо, если его on onCreate() во всех действиях. –

4

Нет необходимости блокировать пользователей корневыми телефонами, поскольку это обычное поведение пользователя. Итак, какую опасность или ущерб вы боитесь, если у вас нет онлайн-соединения для рекордов, покупок в приложении или тому подобного в вашей игре?

Игрок хочет обмануть свой путь до последнего уровня или на вершину местной (!) Таблицы лидеров? Где ущерб?

Предотвращение запуска вашей игры на корневых устройствах не дает вам ничего, кроме отпора законным пользователям вашего приложения.

Edit:

Используйте облако сохранить службу, чтобы сохранить Рекорды игрока. если в автономном режиме он будет зашифрован и сохранен на устройстве. В следующий раз в Интернете вы прочтете рекорды и отправьте его в службу воспроизведения. Служба воспроизведения предоставляет функцию антипиратства, которую вы также можете захотеть.

+0

Извините за то, что вы сбиваете с толку. Я переформулировал PS. Моя игра НЕОБХОДИМО подключение к Интернету (чтобы сообщить о результатах в таблицу лидеров), но НЕ ВСЕГДА (следовательно, чтобы проверить, действительно ли счет «действителен или нет» на гейверпах, терпит неудачу). – DroidHeaven

+0

@DroidHeaven Ах, хорошо, тогда я неправильно понял. Используете ли вы службы Google Play или откатываете ли вы свою систему лидеров? – aggsol

+0

Я использую Службы Google Play – DroidHeaven