2015-11-20 3 views
-1

Я могу очистить данные одного имени пакета с помощью этого фрагмента. Однако я хочу, чтобы он обрабатывал несколько имен пакетов. другими словами, он должен очистить данные более двух имен пакетовочистка данных нескольких приложений android

private void clearData() { 
     //"com.uc.browser.en" 
     //"pm clear com.sec.android.app.sbrowser" 
     String cmd = "pm clear com.sec.android.app.sbrowser" ; 
     ProcessBuilder pb = new ProcessBuilder().redirectErrorStream(true) 
       .command("su"); 
     Process p = null; 
     try { 
      p = pb.start(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // We must handle the result stream in another Thread first 
     StreamReader stdoutReader = new StreamReader(p.getInputStream(), 
       CHARSET_NAME); 
     stdoutReader.start(); 

     out = p.getOutputStream(); 
     try { 
      out.write((cmd + "\n").getBytes(CHARSET_NAME)); 
     } catch (UnsupportedEncodingException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try { 
      out.write(("exit" + "\n").getBytes(CHARSET_NAME)); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      out.flush(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      p.waitFor(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String result = stdoutReader.getResult(); 
    } 
} 
+0

Используйте класс PackageManager для запроса и получения всех установленных пакетов. Заполните в listView, а затем на itemClickListenet очистите данные приложения, соответствующие имени пакета. –

ответ

0

ProcessCommandsSU класс начинает su процесс, в котором запускается список команд, а также предоставляет интерфейс для доставки вывод в Activity асинхронно. В отличие от приведенного вами примера, этот класс не будет блокировать поток пользовательского интерфейса. Activity должен реализовать интерфейс OnCommandsReturnListener.

public class ProcessCommandsSU extends Thread { 
    public interface OnCommandsReturnListener { 
     public void onCommandsReturn(String output); 
    } 

    private final Activity activity; 
    private final String[] cmds; 

    public ProcessCommandsSU(Activity activity, String[] cmds) { 
     if(!(activity instanceof OnCommandsReturnListener)) { 
      throw new IllegalArgumentException(
       "Activity must implement OnCommandsReturnListener interface"); 
     } 

     this.activity = activity; 
     this.cmds = cmds; 
    } 

    public void run() { 
     try { 
      final Process process = new ProcessBuilder() 
             .redirectErrorStream(true) 
             .command("su") 
             .start(); 
      final OutputStream os = process.getOutputStream(); 
      final CountDownLatch latch = new CountDownLatch(1); 
      final OutputReader or = new OutputReader(process.getInputStream(), latch); 

      or.start(); 

      for (int i = 0; i < cmds.length; i++) { 
       os.write((cmds[i] + "\n").getBytes()); 
      } 

      os.write(("exit\n").getBytes()); 
      os.flush(); 

      process.waitFor(); 
      latch.await(); 
      process.destroy(); 

      final String output = or.getOutput(); 
      activity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         ((OnCommandsReturnListener) activity).onCommandsReturn(output); 
        } 
       } 
      ); 
     } 
     catch (IOException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class OutputReader extends Thread { 
     private final InputStream is; 
     private final StringBuilder sb = new StringBuilder(); 
     private final CountDownLatch latch; 

     public OutputReader(InputStream is, CountDownLatch latch) { 
      this.is = is; 
      this.latch = latch; 
     } 

     public String getOutput() { 
      return sb.toString(); 
     } 

     public void run() { 
      try { 
       final BufferedReader reader = new BufferedReader(
        new InputStreamReader(is)); 

       String line = ""; 
       while ((line = reader.readLine()) != null) {      
        sb.append(line + "\n");      
       } 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      latch.countDown(); 
     } 
    } 
} 

Использование класса довольно просто. Сначала мы гарантируем, что наш Activity реализует интерфейс. Затем мы создаем экземпляр, передавая Activity и наш массив команд в конструкторе и вызываем его метод start(). В следующем примере, предполагается, что Activity имеет TextView имени textOutput для отображения возвращенного вывод:

public class MainActivity extends Activity 
    implements ProcessCommandsSU.OnCommandsReturnListener { 
    ... 

    @Override 
    public void onCommandsReturn(String output) { 
     textOutput.append(output + "\n"); 
    } 

    private void runCommands() { 
     final String[] cmds = { 
      "ping -c 5 www.google.com", 
      "pm list packages android", 
      "chdir " + Environment.getExternalStorageDirectory(), 
      "ls" 
     }; 

     new ProcessCommandsSU(MainActivity.this, cmds).start(); 
    } 
} 

Мое устройство не укоренились, так что это была протестирована с помощью команд, которые вы видите в приведенном выше коде. Просто замените эти команды командами pm clear.

Смежные вопросы