Run a service with Root privileges or adding permissions with root

后端 未结 7 975
Happy的楠姐
Happy的楠姐 2021-02-05 16:12

I am currently developing an app that reads out SMS/Emails while driving. Many users wished support for WhatsApp / KakaoTalk.

However, as there is no \"official\" way to

7条回答
  •  感情败类
    2021-02-05 16:57

    Force, I must tell you that an Android Service do not require root access instead some actions(i.e. Access, Read, Write system resources) requires Root Permissions. Every Android Service provided in Android SDK can be run without ROOT ACCESS.

    You can make the actions to execute with root permissions with the help of shell commands.

    I have created an abstract class to help you with that

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import android.util.Log;
    
    public abstract class RootAccess {
        private static final String TAG = "RootAccess";
        protected abstract ArrayList runCommandsWithRootAccess();
    
        //Check for Root Access
        public static boolean hasRootAccess() {
            boolean rootBoolean = false;
            Process suProcess;
    
            try {
                suProcess = Runtime.getRuntime().exec("su");
    
                DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
                DataInputStream is = new DataInputStream(suProcess.getInputStream());
    
                if (os != null && is != null) {
                    // Getting current user's UID to check for Root Access
                    os.writeBytes("id\n");
                    os.flush();
    
                    String outputSTR = is.readLine();
                    boolean exitSu = false;
                    if (outputSTR == null) {
                        rootBoolean = false;
                        exitSu = false;
                        Log.d(TAG, "Can't get Root Access or Root Access deneid by user");
                    } else if (outputSTR.contains("uid=0")) {
                        //If is contains uid=0, It means Root Access is granted
                        rootBoolean = true;
                        exitSu = true;
                        Log.d(TAG, "Root Access Granted");
                    } else {
                        rootBoolean = false;
                        exitSu = true;
                        Log.d(TAG, "Root Access Rejected: " + is.readLine());
                    }
    
                    if (exitSu) {
                        os.writeBytes("exit\n");
                        os.flush();
                    }
                }
            } catch (Exception e) {
                rootBoolean = false;
                Log.d(TAG, "Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage());
            }
    
            return rootBoolean;
        }
    
        //Execute commands with ROOT Permission
        public final boolean execute() {
            boolean rootBoolean = false;
    
            try {
                ArrayList commands = runCommandsWithRootAccess();
                if ( commands != null && commands.size() > 0) {
                    Process suProcess = Runtime.getRuntime().exec("su");
    
                    DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
    
                    // Execute commands with ROOT Permission
                    for (String currentCommand : commands) {
                        os.writeBytes(currentCommand + "\n");
                        os.flush();
                    }
    
                    os.writeBytes("exit\n");
                    os.flush();
    
                    try {
                        int suProcessRetval = suProcess.waitFor();
                        if ( suProcessRetval != 255) {
                            // Root Access granted
                            rootBoolean = true;
                        } else {
                            // Root Access denied
                            rootBoolean = false;
                        }
                    } catch (Exception ex) {
                        Log.e(TAG, "Error executing Root Action", ex);
    
                    }
                }
            } catch (IOException ex) {
                Log.w(TAG, "Can't get Root Access", ex);
            } catch (SecurityException ex) {
                Log.w(TAG, "Can't get Root Access", ex);
            } catch (Exception ex) {
                Log.w(TAG, "Error executing operation", ex);
            }
    
            return rootBoolean;
        }
    
    
    }
    

    Extend your class with RootAccess or create an instance of RootAccess class and Override runCommandsWithRootAccess() method.

提交回复
热议问题