我可以检查 android 布局中授予的权限吗
Can I check granted permissions in android layout
是否只有在授予特定权限后才能将视图添加到布局?
我正在使用名为 QRCodeReaderView 的二维码 reader 库。我在布局中使用 com.dlazaro66.qrcodereaderview.QRCodeReaderView
。
在 Android M 及更高版本上,如果视图在布局中,除非用户接受许可,否则应用程序会崩溃。
是否可以在加载布局时进行检查并仅在获得许可后才决定包含此视图
Is it possible that when loading the layout I can make a check and decide to include this view only if permission is granted
是的,你可以。呼叫ContextCompat.checkSelfPermission
。如果它的结果是PackageManager.PERMISSION_GRANTED
,那么权限被授予。
所以你可以
- 创建
QRCodeReaderView
的实例并将其添加到您创建的布局中,只有在获得许可的情况下。创建内部没有 QRCodeReaderView
的布局,而是使用 FrameLayout
。如有必要,在权限检查后将 QRCodeReaderView
放入此 FrameLayout
中。
- 制作 2 种不同的布局(一种有
QRCodeReaderView
,另一种没有)并根据 checkSelfPermission
结果在 onCreateView
中调用 setContentView
或 inflater.inflate
。
我推荐你第一个,这样你就可以实现请求权限了。当用户授予权限时,您将 QRCodeReaderView
添加到布局中。
@CherryPerry 回答的一些补充:
无需创建两个不同的布局。您可以将 ViewStub
和 QRCodeReaderView
放入您的布局中,只有在获得许可后才调用 inflate
:
if (permissionGranted()) {
qrReaderStub.inflate();
}
样本:
<!-- qr_reader.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<com.dlazaro66.qrcodereaderview.QRCodeReaderView
android:id="@+id/qr_reader"
android:layout_width="100dp"
android:layout_height="100dp" />
<!-- your activity or fragment -->
<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewStub
android:id="@+id/qr_stub"
android:layout="@layout/qr_reader"
android:layout_width="100dp"
android:layout_height="100dp" />
</FrameLayout>
//your activity class
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
ViewStub.class.cast(findViewById(R.id.qr_stub)).inflate();
}
}
是否只有在授予特定权限后才能将视图添加到布局?
我正在使用名为 QRCodeReaderView 的二维码 reader 库。我在布局中使用 com.dlazaro66.qrcodereaderview.QRCodeReaderView
。
在 Android M 及更高版本上,如果视图在布局中,除非用户接受许可,否则应用程序会崩溃。
是否可以在加载布局时进行检查并仅在获得许可后才决定包含此视图
Is it possible that when loading the layout I can make a check and decide to include this view only if permission is granted
是的,你可以。呼叫ContextCompat.checkSelfPermission
。如果它的结果是PackageManager.PERMISSION_GRANTED
,那么权限被授予。
所以你可以
- 创建
QRCodeReaderView
的实例并将其添加到您创建的布局中,只有在获得许可的情况下。创建内部没有QRCodeReaderView
的布局,而是使用FrameLayout
。如有必要,在权限检查后将QRCodeReaderView
放入此FrameLayout
中。 - 制作 2 种不同的布局(一种有
QRCodeReaderView
,另一种没有)并根据checkSelfPermission
结果在onCreateView
中调用setContentView
或inflater.inflate
。
我推荐你第一个,这样你就可以实现请求权限了。当用户授予权限时,您将 QRCodeReaderView
添加到布局中。
@CherryPerry 回答的一些补充:
无需创建两个不同的布局。您可以将 ViewStub
和 QRCodeReaderView
放入您的布局中,只有在获得许可后才调用 inflate
:
if (permissionGranted()) {
qrReaderStub.inflate();
}
样本:
<!-- qr_reader.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<com.dlazaro66.qrcodereaderview.QRCodeReaderView
android:id="@+id/qr_reader"
android:layout_width="100dp"
android:layout_height="100dp" />
<!-- your activity or fragment -->
<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewStub
android:id="@+id/qr_stub"
android:layout="@layout/qr_reader"
android:layout_width="100dp"
android:layout_height="100dp" />
</FrameLayout>
//your activity class
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
ViewStub.class.cast(findViewById(R.id.qr_stub)).inflate();
}
}