码迷,mamicode.com
首页 > 移动开发 > 详细

Android之——利用系统权限实现手机重启

时间:2015-08-15 23:04:25      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:android   签名   权限   

 在应用开发时经常会有这样的需求,如何在应用里用代码让手机重启,另外,我们知道在重启之后,我们的应用可以注册广播接收者,以保证我们的应用会第一个将我们的服务开启起来,这样我们的代码就可以第一个接收到接收短信的广播事件。好了,现在就让我们一起来实现一个利用系统权限实现手机重启的示例吧。

一、实现

我们实现很简单,就是给界面一个按钮,然后设置按钮的点击事情,在点击事件里完成手机重启操作。

1、布局文件

布局文件很简单,就是放置了一个Button按钮,设置点击事件。

具体代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="重启系统" />
    
</LinearLayout>

2、MainActivity

这个类中就是实现了按钮的点击事件,在点击事件里实现重启手机的操作。

package com.lyz.reboot.activity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	public void click(View v){
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_REBOOT);
		intent.putExtra("nowait", 1);
		intent.putExtra("interval", 1);
		intent.putExtra("window", 0);
		sendBroadcast(intent);
	}
}

3、授权文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lyz.reboot.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lyz.reboot.activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

三、运行效果

按照以上的实现,我们开始运行程序,然后点击按钮会报以下错误信息

Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.REBOOT from pid=1786, uid=10033
这是因为Android系统里有很多限制性操作是不允许一般应用程序调用的,比如说:重启手机、关闭手机、修改系统时间、访问受限制的文件等。

四、重新实现

1、解决思路

将我们的应用伪装成系统的应用

2、实现步骤

共享系统UID
使用系统签名(匹配签名需要公钥和密钥两个文件生成keystore

3、具体实现

1)修改AndroidManifest.xml

我们在AndroidManifest.xml文件的manifest节点中增加如下属性,来共享系统uid

android:sharedUserId="android.uid.system"
完整代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lyz.reboot.activity"
    android:versionCode="1"
    android:versionName="1.0" 
    android:sharedUserId="android.uid.system">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lyz.reboot.activity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2)利用eclipse生成apk文件

选中要生成apk文件的工程,右键导出项目到指定目录(具体步骤我在这里就不多说明了)。

3)利用签名工具生成系统签名apk

这里我用了一个工具来生成系统签名apk,这个工具的目录结构如下图:

技术分享

我们将导出的apk文件放到上图所示的文件夹中

如下图:

技术分享

然后我们打开cmd控制台,进入上图所示的目录中,按以下格式输入命令:

java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk
其中input.apk为要签名的apk文件, output.apk为签名后输出的apk文件
操作如下图所示:

技术分享

这里我输入的命令是:

java -jar signapk.jar platform.x509.pem platform.pk8 reboot.apk new.apk
命令执行后在当前目录下会生成一个带有系统签名的一个apk,这个apk文件未new.apk,

如下图:

技术分享

这个new,apk文件就是我们最终生成的apk文件。

4)安装apk文件

首先,我们先要卸载的手机上原来安装的apk文件,然后,在命令行中输入如下命令安装new,apk文件

adb install new.apk
前提是命令行当前目录时new.apk文件所在的目录,具体操作见下图:

技术分享

如果安装后提示"Success"就是安装成功了。

五、运行

点击按钮运行效果为

技术分享

以上就实现了Android利用系统权限实现手机重启的功能。

六、温馨提示

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android之——利用系统权限实现手机重启

标签:android   签名   权限   

原文地址:http://blog.csdn.net/l1028386804/article/details/47687027

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!