Android 6.0 自定義權(quán)限

問題描述: 想在APP1中的Activity中發(fā)送一個廣播蛤育,在APP2中定義一個Receiver然后接收這個廣播,為了安全,這個廣播聲明了一個自定義權(quán)限。但是在6.x的系統(tǒng)上怎么都接收不到廣播晨继。

APP2代碼如下

  1. 定義一個自定義的BroadcastReceiver用于接收廣播消息代碼如下:
public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Q_M:", "成功接收廣播");
    }
}
  1. AndroidManifest.xml聲明自定義權(quán)限,靜態(tài)注冊MyReceiver
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.febsky.myapplication">

     <!-- 權(quán)限聲明 注意最后兩行-->
    <permission
        android:name="me.febsky.PPPP"
        android:label="@string/app_name"
        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
        android:protectionLevel="dangerous"/>

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

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

        <!-- 靜態(tài)注冊 -->
        <receiver
            android:name=".MyReceiver"
            android:permission="me.febsky.PERMISSION">
            <intent-filter>
                <action android:name="me.febsky.ACTION" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

APP1 的主界面就一個Button搬俊,功能是發(fā)送廣播紊扬,不再給出。

  1. button的點擊事件如下:
   private static final String ACTION = "me.febsky.ACTION";

    //button的點擊事件
    public void onClick(View view) {

        Intent intent = new Intent(ACTION);
        // 發(fā)送廣播
        sendBroadcast(intent);
    }
  1. AndroidManifest.xml聲明使用權(quán)限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.febsky.aidltest">

    <!-- 權(quán)限使用聲明 -->
    <uses-permission android:name="me.febsky.PERMISSION" />

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

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

注意這兩個APP的啟動順序唉擂,先啟動APP2餐屎,然后啟動APP1

到這里為止,其實兩個APP之間已經(jīng)可以通信了(6.0以下的手機)玩祟。為什么6.0以上的手機不行腹缩,這就涉及到一個問題,【運行時權(quán)限】空扎。

Android6.0 運行時權(quán)限

對于6.0以下的權(quán)限及在安裝的時候藏鹊,根據(jù)權(quán)限聲明產(chǎn)生一個權(quán)限列表,用戶只有在同意之后才能完成app的安裝勺卢,造成了我們想要使用某個app伙判,就要默默忍受其一些不必要的權(quán)限(比如是個app都要訪問通訊錄象对、短信等)黑忱。而在6.0以后,我們可以直接安裝勒魔,當app需要我們授予不恰當?shù)臋?quán)限的時候甫煞,我們可以予以拒絕(比如:單機的象棋對戰(zhàn),請求訪問任何權(quán)限冠绢,我都是不同意的)抚吠。當然你也可以在設(shè)置界面對每個app的權(quán)限進行查看,以及對單個權(quán)限進行授權(quán)或者解除授權(quán)弟胀。

系統(tǒng)權(quán)限分為兩類:正常權(quán)限和危險權(quán)限:

  • 正常權(quán)限Normal Permissions不會直接給用戶隱私權(quán)帶來風險楷力。如果您的應用在其清單中列出了正常權(quán)限,系統(tǒng)將自動授予該權(quán)限孵户。
  • 危險權(quán)限會授予應用訪問用戶機密數(shù)據(jù)的權(quán)限萧朝。如果您的應用在其清單中列出了正常權(quán)限,系統(tǒng)將自動授予該權(quán)限夏哭。如果您列出了危險權(quán)限检柬,則用戶必須明確批準您的應用使用這些權(quán)限。

Dangerous Permission竖配,是按照權(quán)限組分配使用的何址。如果app運行在Android 6.x的機器上里逆,對于授權(quán)機制是這樣的。如果你申請某個危險的權(quán)限用爪,假設(shè)你的app早已被用戶授權(quán)了同一組的某個危險權(quán)限原押,那么系統(tǒng)會立即授權(quán),而不需要用戶去點擊授權(quán)偎血。比如你的app對READ_CONTACTS已經(jīng)授權(quán)了班眯,當你的app申請WRITE_CONTACTS時,系統(tǒng)會直接授權(quán)通過烁巫。此外署隘,對于申請時彈出的dialog上面的文本說明也是對整個權(quán)限組的說明,而不是單個權(quán)限(ps:這個dialog是不能進行定制的)亚隙。

任何權(quán)限都可屬于一個權(quán)限組磁餐,包括正常權(quán)限和應用定義的權(quán)限。但權(quán)限組僅當權(quán)限危險時才影響用戶體驗阿弃≌锱可以忽略正常權(quán)限的權(quán)限組。

根據(jù)上面的介紹渣淳,我們又兩種解決方式

  1. 聲明權(quán)限為Normal Permissions脾还,也就是在(APP2中的AndroidManifest.xml)聲明權(quán)限的時候
     <!-- 權(quán)限聲明 最后一行-->
    <permission
        android:name="me.febsky.PPPP"
        android:label="@string/app_name"
        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
        android:protectionLevel="normal"/>
  1. 在運行時檢查是否獲得了這個自定義的dangerous權(quán)限,如果沒有那么動態(tài)申請一個入愧。如何動態(tài)申請權(quán)限
    這時候要改造下發(fā)起廣播的app中代碼(APP1)
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view) {
        if (ContextCompat.checkSelfPermission(this, p) == PackageManager.PERMISSION_GRANTED) {
            sendBroadCast();
        } else {
            ActivityCompat.requestPermissions(this, new String[]{p}, 11);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 11) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                sendBroadCast();
            } else {
                Toast.makeText(this, "未授權(quán)!", Toast.LENGTH_LONG).show();
            }
        }
    }

    private static final String p = "me.febsky. PERMISSION";
    private static final String ACTION = "me.febsky.ACTION";

    private void sendBroadCast() {

        Intent shortcut = new Intent(ACTION);
        // 發(fā)送廣播
        sendBroadcast(shortcut);
    }
}

注:羅里吧嗦的說了這么多廢話鄙漏,其實就是一點,如果在Android6.0上聲明的自定義權(quán)限的level是dangerous的棺蛛,那么在使用這個自定義的權(quán)限的app中要動態(tài)的申請這個權(quán)限怔蚌。(也就是要彈出一個請求授權(quán)的Dialog,讓用戶來授權(quán))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁赊,一起剝皮案震驚了整個濱河市桦踊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌终畅,老刑警劉巖籍胯,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異离福,居然都是意外死亡杖狼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門术徊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本刽,“玉大人,你說我怎么就攤上這事∽釉ⅲ” “怎么了暗挑?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斜友。 經(jīng)常有香客問我炸裆,道長,這世上最難降的妖魔是什么鲜屏? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任烹看,我火速辦了婚禮,結(jié)果婚禮上洛史,老公的妹妹穿的比我還像新娘惯殊。我一直安慰自己,他們只是感情好也殖,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布土思。 她就那樣靜靜地躺著,像睡著了一般忆嗜。 火紅的嫁衣襯著肌膚如雪己儒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天捆毫,我揣著相機與錄音闪湾,去河邊找鬼。 笑死绩卤,一個胖子當著我的面吹牛途样,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播省艳,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娘纷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跋炕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤律适,失蹤者是張志新(化名)和其女友劉穎辐烂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捂贿,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡纠修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厂僧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扣草。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辰妙,到底是詐尸還是另有隱情鹰祸,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布密浑,位于F島的核電站蛙婴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尔破。R本人自食惡果不足惜街图,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懒构。 院中可真熱鬧餐济,春花似錦、人聲如沸胆剧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞赖。三九已至滚朵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間前域,已是汗流浹背辕近。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匿垄,地道東北人移宅。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像椿疗,于是被迫代替她去往敵國和親漏峰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容