Get Process ID with shell command and read by Java code
//package org.codeandroid.vpnc_frontend; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.StringTokenizer; import android.util.Log; class Util { private static final String LOG_TAG = "VPN_Connections"; public static final int DISCONNECT_NOTIFICATION = 1; private static final int pidColumn = getPidColumn(); public static int getPidColumn() { try { Process psProcess = Runtime.getRuntime().exec( "sh" ); OutputStream os = psProcess.getOutputStream(); InputStream is = psProcess.getInputStream(); writeLine( os, null, "ps | grep PID" ); writeLine( os, null, "exit" ); try { psProcess.waitFor(); } catch( InterruptedException interruptedException ) { Log.e( LOG_TAG, "While trying to read process id", interruptedException ); return -1; } String headerLine = readString( is, null, false ); Log.d( LOG_TAG, "Read PS header line as " + headerLine ); if( headerLine == null || headerLine.trim().length() == 0 ) { Log.e( LOG_TAG, "Attempt to do a PS did not return anything" ); return -1; } else { StringTokenizer tokenizer = new StringTokenizer( headerLine, " ", false ); int columnCount = tokenizer.countTokens(); for( int index = 0; index < columnCount; index++ ) { if( "PID".equals( tokenizer.nextToken() ) ) { Log.d( LOG_TAG, "PID is in column #" + index ); return index; } } return -1; } } catch( IOException e ) { Log.e( LOG_TAG, "While trying to read process id", e ); return -1; } } public static int getProcessId() { if( pidColumn == -1 ) { return -1; } try { Process psProcess = Runtime.getRuntime().exec( "sh" ); OutputStream os = psProcess.getOutputStream(); InputStream is = psProcess.getInputStream(); writeLine( os, null, "ps | grep 'vpnc$'" ); writeLine( os, null, "exit" ); try { psProcess.waitFor(); } catch( InterruptedException interruptedException ) { Log.e( LOG_TAG, "While trying to read process id", interruptedException ); return 0; } String pidStringLine = readString( is, null, false ); Log.d( LOG_TAG, "Read vpnc process line as " + pidStringLine ); if( pidStringLine == null || pidStringLine.trim().length() == 0 ) { Log.d( LOG_TAG, "Attempt to read vpnc process id did not return anything" ); return -1; } else { StringTokenizer tokenizer = new StringTokenizer( pidStringLine, " ", false ); String pidString = tokenizer.nextToken(); for( int index = 0; index < pidColumn; index++ ) { pidString = tokenizer.nextToken(); } Log.d( LOG_TAG, "Read vpnc process id as " + pidString ); try { return Integer.parseInt( pidString ); } catch( NumberFormatException e ) { Log.w( LOG_TAG, "Could not parse process id of " + pidString, e ); return 0; } } } catch( IOException e ) { Log.e( LOG_TAG, "While trying to read process id", e ); return 0; } } public static String readString(InputStream is, PrintWriter logWriter, boolean block) throws IOException { if( !block && is.available() == 0 ) { //Caller doesn't want to wait for data and there isn't any available right now return null; } byte firstByte = (byte)is.read(); //wait till something becomes available int available = is.available(); byte[] characters = new byte[available + 1]; characters[0] = firstByte; is.read( characters, 1, available ); String string = new String( characters ); if( logWriter != null ) { logWriter.println( string ); } return string; } public static void writeLine(OutputStream os, PrintWriter logWriter, String value) throws IOException { String line = value + "\n"; os.write( line.getBytes() ); if( logWriter != null ) { logWriter.println( value ); } } public static void debug(String msg) { Log.d( LOG_TAG, msg ); } public static void debug(String msg, Throwable throwable) { Log.d( LOG_TAG, msg, throwable ); } public static void info(String msg) { Log.i( LOG_TAG, msg ); } public static void info(String msg, Throwable throwable) { Log.i( LOG_TAG, msg, throwable ); } public static void warn(String msg) { Log.w( LOG_TAG, msg ); } public static void warn(String msg, Throwable throwable) { Log.w( LOG_TAG, msg, throwable ); } public static void error(String msg) { Log.e( LOG_TAG, msg ); } public static void error(String msg, Throwable throwable) { Log.e( LOG_TAG, msg, throwable ); } public static void printLog(int priority, String msg) { Log.println( priority, LOG_TAG, msg ); } }
1. | Run System Command | ||
2. | Get App Name | ||
3. | Check For Installed App | ||
4. | Get Api Level | ||
5. | Exec And Wait |