亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Permission 使用詳解

Eminjannn / 3314人閱讀

摘要:此在軟件包在該設(shè)備上的使用壽命期間保持不變。危險權(quán)限可能影響用戶隱私或設(shè)備正常操作的權(quán)限,系統(tǒng)會要求用戶明確授予這些權(quán)限,否則默認不授予。如果用戶批準(zhǔn),系統(tǒng)將向應(yīng)用授予其請求的權(quán)限。如果所有應(yīng)用并非使用同一證書簽署,則必須這樣做。

極力推薦文章:歡迎收藏
Android 干貨分享

閱讀五分鐘,每日十點,和您一起終身學(xué)習(xí),這里是程序員Android

本篇文章主要介紹 Android 開發(fā)中的部分知識點,通過閱讀本篇文章,您將收獲以下內(nèi)容:

安全架構(gòu)設(shè)計

應(yīng)用簽名

用戶ID 和文件訪問

使用權(quán)限

正常權(quán)限和危險權(quán)限

自定義權(quán)限

動態(tài)申請權(quán)限案例

Android 是一個權(quán)限分隔的操作系統(tǒng),其中每個應(yīng)用都有其獨特的系統(tǒng)標(biāo)識(Linux 用戶 ID 和組 ID)。系統(tǒng)各部分也分隔為不同的標(biāo)識。Linux 據(jù)此將不同的應(yīng)用以及應(yīng)用與系統(tǒng)分隔開來。

其他更詳細的安全功能通過“權(quán)限”機制提供,此機制會限制特定進程可以執(zhí)行的具體操作,并且根據(jù) URI 權(quán)限授權(quán)臨時訪問特定的數(shù)據(jù)段。

Permission 簡介 Permission 繼承關(guān)系
java.lang.Object
????    android.Manifest.permission
1. 安全架構(gòu)設(shè)計

Android 安全架構(gòu)的中心設(shè)計點是:
在默認情況下任何應(yīng)用都沒有權(quán)限執(zhí)行對其他應(yīng)用、操作系統(tǒng)或用戶有不利影響的任何操作。這包括讀取或?qū)懭胗脩舻乃接袛?shù)據(jù)(例如聯(lián)系人或電子郵件)、讀取或?qū)懭肫渌麘?yīng)用程序的文件、執(zhí)行網(wǎng)絡(luò)訪問、使設(shè)備保持喚醒狀態(tài)等。

由于每個 Android 應(yīng)用都是在進程沙盒中運行,因此應(yīng)用必須顯式共享資源和數(shù)據(jù)。它們的方法是聲明需要哪些權(quán)限來獲取基本沙盒未提供的額外功能。應(yīng)用以靜態(tài)方式聲明它們需要的權(quán)限,然后 Android 系統(tǒng)提示用戶同意。

2. 應(yīng)用簽名

所有 APK(.apk 文件)都必須使用證書簽署,其私鑰由開發(fā)者持有。此證書用于識別應(yīng)用的作者。證書不需要由證書頒發(fā)機構(gòu)簽署;Android 應(yīng)用在理想情況下可以而且通常也是使用自簽名證書。證書在 Android 中的作用是識別應(yīng)用的作者。這允許系統(tǒng)授予或拒絕應(yīng)用對簽名級權(quán)限的訪問,以及授予或拒絕應(yīng)用獲得與另一應(yīng)用相同的 Linux 身份的請求。

比如:
聲明一個安全權(quán)限,可用于限制對此或其他應(yīng)用程序的特定組件或功能的訪問。

3. 用戶ID 和文件訪問

在安裝時,Android 為每個軟件包提供唯一的 Linux 用戶 ID。此 ID 在軟件包在該設(shè)備上的使用壽命期間保持不變。在不同設(shè)備上,相同軟件包可能有不同的 UID;重要的是每個軟件包在指定設(shè)備上的 UID 是唯一的。

由于在進程級實施安全性,因此任何兩個軟件包的代碼通常都不能在同一進程中運行,因為它們需要作為不同的 Linux 用戶運行。您可以在每個軟件包的 AndroidManifest.xmlmanifest 標(biāo)記中使用 sharedUserId 屬性,為它們分配相同的用戶 ID。這樣做以后,出于安全目的,兩個軟件包將被視為同一個應(yīng)用,具有相同的用戶 ID 和文件權(quán)限。

為保持安全性,只有兩個簽署了相同簽名(并且請求相同的 sharedUserId)的應(yīng)用才被分配同一用戶 ID。

應(yīng)用存儲的任何數(shù)據(jù)都會被分配該應(yīng)用的用戶 ID,并且其他軟件包通常無法訪問這些數(shù)據(jù)。使用 getSharedPreferences(String, int)、openFileOutput(String, int) openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 創(chuàng)建新文件時,可以使用 MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 標(biāo)記允許任何其他軟件包讀取/寫入文件。設(shè)置這些標(biāo)記時,文件仍歸您的應(yīng)用所有,但其全局讀取和/或?qū)懭霗?quán)限已適當(dāng)設(shè)置,使任何其他應(yīng)用都可看見它。

4. 使用權(quán)限

基本 Android 應(yīng)用默認情況下未關(guān)聯(lián)權(quán)限,這意味著它無法執(zhí)行對用戶體驗或設(shè)備上任何數(shù)據(jù)產(chǎn)生不利影響的任何操作。要利用受保護的設(shè)備功能,必須在應(yīng)用清單中包含一個或多個 標(biāo)記。

例如,需要監(jiān)控傳入的短信的應(yīng)用要指定:

權(quán)限分類:

正常權(quán)限

不會對用戶隱私或設(shè)備操作造成很大風(fēng)險的權(quán)限,系統(tǒng)會自動授予這些權(quán)限。

危險權(quán)限

可能影響用戶隱私或設(shè)備正常操作的權(quán)限,系統(tǒng)會要求用戶明確授予這些權(quán)限,否則默認不授予。

注意:
Android 6.0 之后(targetSdkVersion SDK 23之上)的版本,處于對手機用戶更安全的機制考慮,在應(yīng)用使用可能影響用戶隱私的危險權(quán)限時,需要動態(tài)申請權(quán)限,必須用戶手動授予權(quán)限才可以,僅在Androidmainfest.xml 中申請權(quán)限是不夠的。

高版本Android系統(tǒng)中,如不動態(tài)申請權(quán)限,則會報SecurityException的錯誤,但不能保證每個地方都是這樣。例如,sendBroadcast(Intent) 方法在數(shù)據(jù)傳遞到每個接收者時會檢查權(quán)限,在方法調(diào)用返回后,即使權(quán)限失效,您也不會收到異常。但在幾乎所有情況下,權(quán)限失效會記入系統(tǒng)日志。

特定使用權(quán)限場景

在調(diào)用系統(tǒng)時,防止應(yīng)用執(zhí)行某些功能。

在啟動 Activity 時,防止應(yīng)用啟動其他應(yīng)用的 Activity

在發(fā)送和接收廣播時,控制誰可以接收您的廣播,誰可以向您發(fā)送廣播。

在訪問和操作內(nèi)容提供程序時。

綁定至服務(wù)或啟動服務(wù)。

5. 正常權(quán)限和危險權(quán)限

正常權(quán)限涵蓋應(yīng)用需要訪問其沙盒外部數(shù)據(jù)或資源,但對用戶隱私或其他應(yīng)用操作風(fēng)險很小的區(qū)域。例如,設(shè)置時區(qū)的權(quán)限就是正常權(quán)限。如果應(yīng)用聲明其需要正常權(quán)限,系統(tǒng)會自動向應(yīng)用授予該權(quán)限。

危險權(quán)限涵蓋應(yīng)用需要涉及用戶隱私信息的數(shù)據(jù)或資源,或者可能對用戶存儲的數(shù)據(jù)或其他應(yīng)用的操作產(chǎn)生影響的區(qū)域。例如,能夠讀取用戶的聯(lián)系人屬于危險權(quán)限。如果應(yīng)用聲明其需要危險權(quán)限,則用戶必須明確向應(yīng)用授予該權(quán)限。

權(quán)限組

所有危險的 Android 系統(tǒng)權(quán)限都屬于權(quán)限組。

如果應(yīng)用請求其清單中列出的危險權(quán)限,而應(yīng)用目前在權(quán)限組中沒有任何權(quán)限,則系統(tǒng)會向用戶顯示一個對話框,描述應(yīng)用要訪問的權(quán)限組。對話框不描述該組內(nèi)的具體權(quán)限。例如,如果應(yīng)用請求 READ_CONTACTS 權(quán)限,系統(tǒng)對話框只說明該應(yīng)用需要訪問設(shè)備的聯(lián)系信息。如果用戶批準(zhǔn),系統(tǒng)將向應(yīng)用授予其請求的權(quán)限。

如果應(yīng)用請求其清單中列出的危險權(quán)限,而應(yīng)用在同一權(quán)限組中已有另一項危險權(quán)限,則系統(tǒng)會立即授予該權(quán)限,而無需與用戶進行任何交互。例如,如果某應(yīng)用已經(jīng)請求并且被授予了 READ_CONTACTS 權(quán)限,然后它又請求 WRITE_CONTACTS,系統(tǒng)將立即授予該權(quán)限。

任何權(quán)限都可屬于一個權(quán)限組,包括正常權(quán)限和應(yīng)用定義的權(quán)限。但權(quán)限組僅當(dāng)權(quán)限危險時才影響用戶體驗??梢院雎哉?quán)限的權(quán)限組。

要實施您自己的權(quán)限,必須先使用一個或多個 元素在 AndroidManifest.xml 中聲明它們。 例如,想要控制誰可以開始其中一個 Activity 的應(yīng)用可如下所示聲明此操作的權(quán)限:

6. 自定義權(quán)限

如果要設(shè)計一套向彼此顯示功能的應(yīng)用,請盡可能將應(yīng)用設(shè)計為每個權(quán)限只定義一次。如果所有應(yīng)用并非使用同一證書簽署,則必須這樣做。即使所有應(yīng)用使用同一證書簽署,最佳做法也是每個權(quán)限只定義一次。

如果功能僅適用于使用與提供應(yīng)用相同的簽名所簽署的應(yīng)用,您可能可以使用簽名檢查避免定義自定義權(quán)限。當(dāng)一個應(yīng)用向另一個應(yīng)用發(fā)出請求時,第二個應(yīng)用可在遵從該請求之前驗證這兩個應(yīng)用是否使用同一證書簽署。

如果您要開發(fā)一套只在您自己的設(shè)備上運行的應(yīng)用,則應(yīng)開發(fā)并安裝管理該套件中所有應(yīng)用權(quán)限的軟件包。此軟件包本身無需提供任何服務(wù)。它只是聲明所有權(quán)限,然后套件中的其他應(yīng)用通過元素請求這些權(quán)限。

在 AndroidManifest.xml 中實施權(quán)限

您可以通過 AndroidManifest.xml 應(yīng)用高級權(quán)限,限制訪問系統(tǒng)或應(yīng)用的全部組件。要執(zhí)行此操作,在所需的組件上包含 android:permission 屬性,為用于控制訪問它的權(quán)限命名。

Activity 權(quán)限

(應(yīng)用于 標(biāo)記)限制誰可以啟動相關(guān)的 Activity。在 Context.startActivity() Activity.startActivityForResult() 時會檢查權(quán)限;如果調(diào)用方?jīng)]有所需的權(quán)限,則調(diào)用會拋出 SecurityException

2 . Service 權(quán)限

(應(yīng)用于 標(biāo)記)限制誰可以啟動或綁定到相關(guān)的服務(wù)。在 Context.startService()、Context.stopService() Context.bindService() 時會檢查權(quán)限;如果調(diào)用方?jīng)]有所需的權(quán)限,則調(diào)用會拋出 SecurityException

3 .BroadcastReceiver 權(quán)限

(應(yīng)用于 標(biāo)記)限制誰可以發(fā)送廣播給相關(guān)的接收方。在 Context.sendBroadcast() 返回后檢查權(quán)限,因為系統(tǒng)會嘗試將提交的廣播傳遞到指定的接收方。因此,權(quán)限失效不會導(dǎo)致向調(diào)用方拋回異常;只是不會傳遞該 intent。

同樣,可以向 Context.registerReceiver() 提供權(quán)限來控制誰可以廣播到以編程方式注冊的接收方。另一方面,可以在調(diào)用 Context.sendBroadcast() 時提供權(quán)限來限制允許哪些 BroadcastReceiver 對象接收廣播。

4 .ContentProvider 權(quán)限

(應(yīng)用于 標(biāo)記)限制誰可以訪問 ContentProvider 中的數(shù)據(jù)。(內(nèi)容提供程序有重要的附加安全工具可用,稱為 URI 權(quán)限,將在后面介紹。)與其他組件不同,您可以設(shè)置兩個多帶帶的權(quán)限屬性:android:readPermission 限制誰可以讀取提供程序,android:writePermission 限制誰可以寫入提供程序。

請注意,如果提供程序有讀取和寫入權(quán)限保護,僅擁有寫入權(quán)限并不表示您可以讀取提供程序。第一次檢索提供程序時將會檢查權(quán)限(如果沒有任何權(quán)限,將會拋出 SecurityException),對提供程序執(zhí)行操作時也會檢查權(quán)限。使用 ContentResolver.query() 需要擁有讀取權(quán)限;使用 ContentResolver.insert()、ContentResolver.update()、ContentResolver.delete() 需要寫入權(quán)限。在所有這些情況下,沒有所需的權(quán)限將導(dǎo)致調(diào)用拋出 SecurityException。

7. 動態(tài)申請權(quán)限D(zhuǎn)emo

實現(xiàn)效果如下:

實現(xiàn)代碼如下:

public class PermissionActivity extends Activity {

    private static final int PERMISSION_REQUEST_CODE = 10000;

    String[] mPermissionsArrays = { Manifest.permission.READ_CONTACTS,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
    }

    @SuppressLint("NewApi")
    public void PermissionOnClick(View view) {

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            // Android 6.0 之下無須動態(tài)申請權(quán)限 ,讓用戶手動授權(quán)
            Toast.makeText(getApplicationContext(),
                    "Android 6.0 以下版本不需要用戶手動授權(quán)", 0).show();
        } else {

            boolean isAllGranted = checkPermissionAllGranted(mPermissionsArrays);
            // 如果已經(jīng)授權(quán),繼續(xù)執(zhí)行其他任務(wù)
            if (isAllGranted) {
                //
                Toast.makeText(getApplicationContext(), "已經(jīng)授權(quán)", 0).show();

            } else {
                // 沒有授權(quán)則開啟申請授權(quán)流程
                requestPermissions(mPermissionsArrays, PERMISSION_REQUEST_CODE);
            }
        }

    }

    /**
     * 檢查是否擁有指定的所有權(quán)限
     */
    @SuppressLint("NewApi")
    private boolean checkPermissionAllGranted(String[] permissions) {

        for (String permission : permissions) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                // 只要有一個權(quán)限沒有被授予, 則直接返回 false
                return false;
            }
        }
        return true;
    }

    /***
     * 在授權(quán)權(quán)限返回結(jié)果時候 處理
     * 
     * **/
    @Override
    public void onRequestPermissionsResult(int requestCode,
            String[] permissions, int[] grantResults) {

        if (requestCode == PERMISSION_REQUEST_CODE) {
            boolean isAllGranted = true;

            for (int grant : grantResults) {
                if (grant != PackageManager.PERMISSION_GRANTED) {
                    isAllGranted = false;
                    break;
                }
            }
            if (isAllGranted) {
                // 如果所有的權(quán)限都授予了, 則執(zhí)行備份代碼
                Toast.makeText(getApplicationContext(), "已經(jīng)授權(quán)", 0).show();
            } else {

                // 彈出對話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動打開權(quán)限按鈕
                openPermissionsDialog();
            }
        }
    }

    private void openPermissionsDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this,
                android.R.style.Theme_Material_Light_Dialog_Alert);
        builder.setMessage("需要獲取 聯(lián)系人、 SD卡、手機狀態(tài)權(quán)限 ,請允許授權(quán),否則會影響您的使用。如需關(guān)閉,請到 設(shè)置-應(yīng)用信息 -> 權(quán)限 中關(guān)閉!");
        builder.setPositiveButton("去手動授權(quán)",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        intent.addCategory(Intent.CATEGORY_DEFAULT);
                        intent.setData(Uri.parse("package:" + getPackageName()));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                        intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

                        startActivity(intent);
                    }
                });
        builder.setNegativeButton("取消", null);
        builder.show();
    }
}

注意:需要在AndroidMainfest.xml 中申請權(quán)限


`

至此,本篇已結(jié)束,如有不對的地方,歡迎您的建議與指正。同時期待您的關(guān)注,感謝您的閱讀,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/75831.html

相關(guān)文章

  • 詳解基于vue,vue-router, vuex以及addRoutes進行權(quán)限控制

    摘要:基于的權(quán)限控制教程,完整代碼地址見接下來讓我們模擬一個普通用戶打開網(wǎng)站的過程,一步一步的走完整個流程。由于權(quán)限這塊邏輯還挺多,所以在添加了一個模塊來處理權(quán)限。 基于vuex, vue-router,vuex的權(quán)限控制教程,完整代碼地址見 https://github.com/linrunzhen... 接下來讓我們模擬一個普通用戶打開網(wǎng)站的過程,一步一步的走完整個流程。 首先從打開本...

    eternalshallow 評論0 收藏0
  • yii實現(xiàn)rbac詳解

    摘要:在中,權(quán)限與角色相關(guān)聯(lián),用戶通過成為適當(dāng)角色的成員而得到這些角色的權(quán)限。這就極大地簡化了權(quán)限的管理。角色可依新的需求和系統(tǒng)的合并而賦予新的權(quán)限,而權(quán)限也可根據(jù)需要而從某角色中回收。角色與角色的關(guān)系可以建立起來以囊括更廣泛的客觀情況。 之前有個朋友問我yii的rbac怎么做,以前大學(xué)的時候有接觸過,很長時間沒用了,也忘記了,正好這幾天比較閑,重新捋了下大體思路,希望可以幫到困在yii的r...

    lentrue 評論0 收藏0
  • Android App 如何生成以太坊錢包

    摘要:以太坊,主要講解如何使用開發(fā)基于的以太坊應(yīng)用,包括賬戶管理狀態(tài)與交易智能合約開發(fā)與交互過濾器和事件等。 Android應(yīng)用程序以太坊錢包生成,要做的工作不少,不過如果我們一步一步來應(yīng)該也比較清楚: 1.在app/build.gradle中集成以下依賴項: compile (org.web3j:core-android:2.2.1) web3j核心是用于從服務(wù)器下載以太坊區(qū)塊鏈數(shù)據(jù)的核心...

    不知名網(wǎng)友 評論0 收藏0
  • Android App 如何生成以太坊錢包

    摘要:以太坊,主要講解如何使用開發(fā)基于的以太坊應(yīng)用,包括賬戶管理狀態(tài)與交易智能合約開發(fā)與交互過濾器和事件等。 Android應(yīng)用程序以太坊錢包生成,要做的工作不少,不過如果我們一步一步來應(yīng)該也比較清楚: 1.在app/build.gradle中集成以下依賴項: compile (org.web3j:core-android:2.2.1) web3j核心是用于從服務(wù)器下載以太坊區(qū)塊鏈數(shù)據(jù)的核心...

    _ipo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<