|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你可能还需要学习使用Xcode这个开发环境,接著你需要掏钱向苹果注册开发者权限,基本的帐号是99美金。本视频为“斯坦福大学iPhone开发教程”,51CTO将不断关注本视频教程的更新进度,为大家提供最新的视频。因为项目必要root安装软件,而且但愿在符合的时分引诱用户往开启root安装,故必要检测手机是不是root。
最基础的判别以下,间接运转一个底层命令。(参考https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ShellUtils.java)
也可参考csdnhttp://blog.csdn.net/fm9333/article/details/12752415
<br>
<br>- 1/**2*checkwhetherhasrootpermission3*4*@return5*/6publicstaticbooleancheckRootPermission(){7returnexecCommand("echoroot",true,false).result==0;8}91011/**12*executeshellcommands13*14*@paramcommands15*commandarray16*@paramisRoot17*whetherneedtorunwithroot18*@paramisNeedResultMsg19*whetherneedresultmsg20*@return<ul>21*<li>ifisNeedResultMsgisfalse,{@linkCommandResult#successMsg}22*isnulland{@linkCommandResult#errorMsg}isnull.</li>23*<li>if{@linkCommandResult#result}is-1,theremaybesome24*excepiton.</li>25*</ul>26*/27publicstaticCommandResultexecCommand(String[]commands,booleanisRoot,28booleanisNeedResultMsg){29intresult=-1;30if(commands==null||commands.length==0){31returnnewCommandResult(result,null,null);32}3334Processprocess=null;35BufferedReadersuccessResult=null;36BufferedReadererrorResult=null;37StringBuildersuccessMsg=null;38StringBuildererrorMsg=null;3940DataOutputStreamos=null;41try{42process=Runtime.getRuntime().exec(43isRoot?COMMAND_SU:COMMAND_SH);44os=newDataOutputStream(process.getOutputStream());45for(Stringcommand:commands){46if(command==null){47continue;48}4950//donnotuseos.writeBytes(commmand),avoidchinesecharset51//error52os.write(command.getBytes());53os.writeBytes(COMMAND_LINE_END);54os.flush();55}56os.writeBytes(COMMAND_EXIT);57os.flush();5859result=process.waitFor();60//getcommandresult61if(isNeedResultMsg){62successMsg=newStringBuilder();63errorMsg=newStringBuilder();64successResult=newBufferedReader(newInputStreamReader(65process.getInputStream()));66errorResult=newBufferedReader(newInputStreamReader(67process.getErrorStream()));68Strings;69while((s=successResult.readLine())!=null){70successMsg.append(s);71}72while((s=errorResult.readLine())!=null){73errorMsg.append(s);74}75}76}catch(IOExceptione){77e.printStackTrace();78}catch(Exceptione){79e.printStackTrace();80}finally{81try{82if(os!=null){83os.close();84}85if(successResult!=null){86successResult.close();87}88if(errorResult!=null){89errorResult.close();90}91}catch(IOExceptione){92e.printStackTrace();93}9495if(process!=null){96process.destroy();97}98}99returnnewCommandResult(result,successMsg==null?null100:successMsg.toString(),errorMsg==null?null101:errorMsg.toString());102}103104/**105*resultofcommand,106*<ul>107*<li>{@linkCommandResult#result}meansresultofcommand,0meansnormal,108*elsemeanserror,sametoexcuteinlinuxshell</li>109*<li>{@linkCommandResult#successMsg}meanssuccessmessageofcommand110*result</li>111*<li>{@linkCommandResult#errorMsg}meanserrormessageofcommandresult</li>112*</ul>113*114*@authorTrinea2013-5-16115*/116publicstaticclassCommandResult{117118/**resultofcommand**/119publicintresult;120/**successmessageofcommandresult**/121publicStringsuccessMsg;122/**errormessageofcommandresult**/123publicStringerrorMsg;124125publicCommandResult(intresult){126this.result=result;127}128129publicCommandResult(intresult,StringsuccessMsg,StringerrorMsg){130this.result=result;131this.successMsg=successMsg;132this.errorMsg=errorMsg;133}134}/**135*executeshellcommand,defaultreturnresultmsg136*137*@paramcommand138*command139*@paramisRoot140*whetherneedtorunwithroot141*@return142*@seeShellUtils#execCommand(String[],boolean,boolean)143*/144publicstaticCommandResultexecCommand(Stringcommand,booleanisRoot){145returnexecCommand(newString[]{command},isRoot,true);146}
复制代码
<br>
可是这会带来一个成绩,每次判别是不是root城市弹出一个root哀求框。这是非常不友爱的一种交互体例,并且,用户假如选择作废,有部分别机是判别为非root的。
这是办法一。交互不友爱,并且有误判。
在这个情形下,为了不弹出确认框,思索到一样平常root手机城市有一些的特别文件夹,好比/system/bin/su,/system/xbin/su,内里寄存有相干的权限把持文件。
因而只需手机中有一个文件夹存在就判别这个手机root了。
然后经由测试,这类办法在年夜部分别机都可行。
代码以下:
<br>- 1/**判别是不是具有ROOT权限,此办法对有些手机有效,好比小米系列*/2publicstaticbooleanisRoot(){34booleanres=false;56try{7if((!newFile("/system/bin/su").exists())8&&(!newFile("/system/xbin/su").exists())){9res=false;10}else{11res=true;12}13;14}catch(Exceptione){15res=false;16}17returnres;18}
复制代码
<br>
这是办法二。交互友爱,可是有误判。
厥后测试的过程当中发明部分国产,好比小米系列,有这个文件夹,可是体系是未root的,判别成了已root。经由剖析,这是因为小米有本身的权限把持体系而招致。
思索到小米手机有大批的用户群,这个成绩必需办理,以是不能不寻觅第三种计划。
从道理动手,小米手机不管是不是root,应当都是具有相干文件的。可是有效的缘故原由应当是,文件设置了相干的权限。招致用户组没法实行相干文件。
从这个角度看,就能够从判别文件的权限动手。
先看下linux的文件权限吧。
<br>
linux文件权限具体可参考《鸟叔的linux私房菜》http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission.php#filepermission_perm
只必要在第二种办法的基本上,再别的判别文件具有者对这个文件是不是具有可实行权限(第4个字符的形态),就基础能够断定手机是不是root了。
在已root手机上(三星i9100android4.4),文件权限(x大概s,s权限,可参考http://blog.chinaunix.net/uid-20809581-id-3141879.html)以下
<br>
维护一个堆栈-(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated是像堆栈里压一个UIViewController-(UIViewController*)popViewControllerAnimated:(BOOL)animated是从堆栈里弹出来一个UIViewController就算你的程序不是像联系人那样向右推进也可以用UINavigationController |
|