目次
7.1コンテンツプロバイダーの概要
コンテンツプロバイダー(コンテンツプロバイダー)は、主に異なるアプリケーション間でのデータ共有機能を実現するために使用されます。これは、あるプログラムが別のプログラムのデータにアクセスできるようにすると同時に、アクセスされたデータのセキュリティを確保するための完全なメカニズムを提供します。
コンテンツプロバイダーは、共有するデータの部分のみを選択できるため、プログラム内の個人データが漏洩するリスクはありません。
7.2実行権限
Android 6.0は、ユーザーのセキュリティとプライバシーを保護するランタイム権限機能を指します。
7.2.1Androidの許可メカニズムの詳細な説明
Androidでは、ユーザーへのアクセスにセキュリティが含まれる場合、AndroidManifest.xmlに対応する権限を追加する必要があります。このようにして、ユーザーは次の2つの側面で保護されます
在低于6.0的系统设备上安装程序时,就会在安装界面提醒用户该apk需要的权限
用户可以在应用程序管理界面查看任意一个程序的权限申请情况
ただし、一般的に使用されるソフトウェアの多くには「いじめ」があり、多くの権限を悪用しています。そのため、Android R&Dチームは6.0でランタイム権限機能を追加しました。つまり、ユーザーは、ソフトウェアのインストール時に要求されたすべてのアクセス許可を一度に承認する必要はありませんが、ソフトウェアの使用中に特定のアクセス許可要求を承認できます。
もちろん、すべての権限が実行時に適用されるわけではありません。
●通常の権限
●危険な権限
通常の権限:ユーザーの安全とプライバシーを脅かさない権限を指し、システムが自動的にそれを承認します。
危険なアクセス許可:ユーザーのプライバシーに影響を与えたり、デバイスのセキュリティに影響を与えたりする可能性のあるアクセス許可を指します。ユーザーは手動で認証をクリックする必要があります。そうしないと、プログラムは対応する機能を使用できません。
Androidの危険な権限は、主に次のとおりです。
注:テーブル内の各権限は権限グループに属し、実行時の権限を処理するときに権限名が使用されます。ユーザーが承認に同意すると、権限に対応する権限グループが使用されます。他のすべての権限も同時に承認されます。
クリックしてAndroidシステムのすべての権限を表示します
7.2.2プログラムの実行中に許可を申請する
androidアプリケーションパーミッションAPI:
1.checkSelfPermissionは、パーミッションが許可されているかどうかを確認します
2 requestPermissionsは、1つまたは複数のパーミッションを
リクエストします3.onRequestPermissionsResultは、パーミッションを手動でリクエストした後、結果をコールバックします
4.shouldShowRequestPermissionRationale「notasking」
shouldShowRequestPermissionRationaleに特に注意してください:
1.第一次用户没有请求权限 false
2.用户第一次请求了权限 拒绝true 允许 false
3.用户再次请求 显示不在询问 点击不在询问 拒绝 false 点击不在询问允许false
只有当用户选择不在提醒拒绝是返回false
説明:
ステップ1:ユーザーが許可しているかどうかを確認します
。checkSelfPermission()メソッドを使用して、ユーザーが許可しているかどうかを確認します。合計2つのパラメーターが受信されます。
参数一:上下文
参数二:具体的权限名 Manifest.permission.xxxxx
ステップ2:戻り値をPackageManager.PERMISSION_GRANTEDと比較します。等しい場合は、ユーザーが許可されていることを意味し、等しくない場合は、ユーザーが許可されていないことを意味します。
手順3:承認がない場合は、requestPermissions()メソッドを呼び出して、ユーザーに承認を申請します。requestPermissions()は、次の3つのパラメーターを受け取ります。
参数一:Activity实例
参数二:String数组,把要申请的权限名放在数组中
参数三:请求码,只要确保是唯一值就行
**ステップ4:**認証結果を
判断します。ユーザーが「クリックして尋ねない」かどうかを判断し、クリックして設定画面にジャンプし、手動で権限を開きます。
注:ユーザーが初めてapkを起動したとき、パーミッションのリクエスト「NotAsking」の場合は表示されません。今後のパーミッションリクエストでのみ表示されます。ユーザーが「NotAsking」をクリックするとfalseが返されます。
例:
ボタンの許可リクエストをクリックします
public class MainActivity extends AppCompatActivity {
private static final String TAG = "permission";
private String[] perm = {
Manifest.permission.ACCESS_COARSE_LOCATION, //定位权限
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_PHONE_STATE
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG,"onCreate");
}
public void Call(View view) {
switch (view.getId()) {
case R.id.button:
CheckPermission(perm);
break;
case R.id.button1:
break;
}
}
public void CheckPermission(String [] perm) {
//1.首先检查有没有权限
//2.在请求权限
//3.
if (Build.VERSION.SDK_INT>23 && this.getApplicationInfo().targetSdkVersion>23) {
List<String> denpermis = new ArrayList<>();
for (String string:perm) {
int result = this.checkSelfPermission(string);
if (result!= PackageManager.PERMISSION_GRANTED) {
denpermis.add(string);
}
}
if (denpermis.size()!=0) {
String[] strings = denpermis.toArray(new String[denpermis.size()]);
this.requestPermissions(strings,0);
}
}
}
//权限结果
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.d(TAG,"onRequestPermissionsResult:"+requestCode+" "+permissions.length+" "+ Arrays.toString(grantResults));
for (int i=0;i<grantResults.length;i++) {
if (grantResults[i]!=PackageManager.PERMISSION_GRANTED) {
//没有点击允许
boolean is = this.shouldShowRequestPermissionRationale(permissions[i]); //第一次进入是默认是false 以后都是true
if (is) {
Log.d(TAG,"true");
}else {
//点击了不在询问 手动 跳转到设置界面
Log.d(TAG,"false");
showMissingPermissionDialog();
break;
}
}
}
}
private void showMissingPermissionDialog() {
//如果权限没有获取,弹窗显示
try{
Log.d(TAG, "showMissingPermissionDialog ");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("当前应用缺少必要权限。\\n\\n请点击\\\"设置\\\"-\\\"权限\\\"-打开所需权限");
// 拒绝, 退出应用
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try{
finish();
} catch (Throwable e) {
e.printStackTrace();
}
}
});
//进入设置,设置权限
builder.setPositiveButton("设置",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
startAppSettings();//启动设置
} catch (Throwable e) {
e.printStackTrace();
}
}
});
builder.setCancelable(false);
builder.show();
}catch(Throwable e){
e.printStackTrace();
}
}
private void startAppSettings() {
try{
Log.d(TAG, "startAppSettings begin ");
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
Log.d(TAG, "startActivity end");
} catch (Throwable e) {
e.printStackTrace();
}
}
}
7.3他のプログラムのデータへのアクセス
コンテンツプロバイダーの主な用途は2つあります。
- 既存のコンテンツプロバイダーを使用して、対応するプログラムのデータを読み取り、操作します
- 独自のコンテンツプロバイダーを作成して、プログラムのデータへの外部アクセスを提供します
アプリケーションがコンテンツプロバイダーを介してデータへの外部アクセスインターフェイスを提供する場合、他のアプリケーションはデータのこの部分にアクセスできます。Androidシステムに付属する電話帳、SMS、メディアライブラリ、およびその他のプログラムはすべて、同様のインターフェース。サードパーティのアプリケーションがデータのこの部分を最大限に活用して、より優れた機能を実現できるようにします。