And*_*art 280 java permissions android android-permissions
我正在更新我们的应用程序以使用新的M权限系统.除了onRequestPermissionsResult()之外,它都在工作.我需要在按下按钮时检查权限,如果成功,则发送短信.当我授予这样做的权限时,对话框会关闭,但在我再次按下按钮之前它不会触发发送文本.
我已经在onRequestPermissionsResult()方法中调试并设置了断点,但它从未进入过它.
首先调用此方法:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
Run Code Online (Sandbox Code Playgroud)
然后我的回调看起来像这样:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过类似的问题?感谢任何帮助.谢谢
小智 566
我遇到了同样的问题,我刚刚找到了解决方案.使用支持库时,必须使用正确的方法调用.例如:
如果在片段中调用ActivityCompat.requestPermissions,则会在活动而不是片段上调用onRequestPermissionsResult回调.
希望这可以帮助!
小智 98
你可以试试这个:
requestPermissions(permissions, PERMISSIONS_CODE);
Run Code Online (Sandbox Code Playgroud)
如果从片段调用此代码,则它具有自己的requestPermissions方法.我相信问题是你正在调用静态方法.
Pro Tip如果你想要onRequestPermissionsResult()一个片段:
FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
San*_*iya 66
我希望它运作正常
对于活动:
ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
片段:
requestPermissions(permissionsList,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
Sim*_*one 50
我也遇到过这个问题.如果您希望处理权限的活动不在历史记录/最近,那么您将很想更改您的AndroidManifest.xml条目.
如果您设置了您呼叫requestPermissions或AppCompatActivity.requestPermissions使用 的活动
android:noHistory="true"
android:excludeFromRecents="true"
Run Code Online (Sandbox Code Playgroud)
在你的AndroidManifest.xml当时onRequestPermissionsResult()不会被召唤.如果您的活动派生于Activity或,则属实AppCompatActivity.
这可以通过从"AndroidManifest.xml"中删除两个标志并完成您的活动finishAndRemoveTask()来解决.
小智 36
如果您同时拥有onRequestPermissionsResult活动和片段,请务必调用super.onRequestPermissionsResult活动.片段中不需要它,但它处于活动状态.
Ben*_*hed 31
在片段内部,您需要调用:
FragmentCompat.requestPermissions(permissionsList, RequestCode)
Run Code Online (Sandbox Code Playgroud)
不:
ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);
Run Code Online (Sandbox Code Playgroud)
小智 15
如果您在片段中使用requestPermissions,则它接受2个参数而不是3个.
你应该用 requestPermissions(permissions, PERMISSIONS_CODE);
Tou*_*der 15
如果由于某种原因你扩展了一个位于某个不调用super的外部库中的自定义Activity,你需要在Activity onRequestPermissionsResult中自己手动调用Fragment super.onRequestPermissionsResult.
YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestingFragment!=null)
requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
...
Run Code Online (Sandbox Code Playgroud)
Mar*_*uez 12
您在FragmentCompat中有 pre Marshmallow设备的checkPermissions函数.我用这样的:
FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
Run Code Online (Sandbox Code Playgroud)
alm*_*oft 12
我发现你打电话的地方很重要android.support.v4.app.Fragment.requestPermissions.
如果你这样做onCreate(),onRequestPermissionsResult()永远不会被调用.
解决方案:调用它onActivityCreated();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED)
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);
}
Run Code Online (Sandbox Code Playgroud)
And*_*art 10
这个问题实际上是由NestedFragments引起的.基本上大多数片段我们扩展了一个HostedFragment,后者又扩展了CompatFragment.拥有这些嵌套的片段会导致最终由项目上的其他开发人员解决的问题.
他正在做一些低级别的事情,如位切换以使其工作,所以我不太确定实际的最终解决方案
/* use the object of your fragment to call the
* onRequestPermissionsResult in fragment after
* in activity and use different request Code for
* both Activity and Fragment */
if (isFragment)
mFragment.requestPermissions(permissions.toArray(new
String[permissions.size()]),requestPermission);
else
ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
String[permissions.size()]),requestPermission);
Run Code Online (Sandbox Code Playgroud)
这将有效..
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
Run Code Online (Sandbox Code Playgroud)
如果从片段调用此代码,则它具有自己的requestPermissions方法.
所以基本概念是,如果你在一个Activity中,那就打电话
ActivityCompat.requestPermissions(this,
permissionsList,
permissionscode);
Run Code Online (Sandbox Code Playgroud)
如果在片段中,只需打电话
requestPermissions(permissionsList,
permissionscode);
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题,除了我按下一个按钮拨打电话,这会触发 callIntent。我首先检查了权限,如果没有被授予我请求权限和 onRequestPermissionResult 我调用检查权限并再次调用。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {
checkPermissionsAndCall();
}
}
}
}
public void checkPermissionsAndCall(){
if (Build.VERSION.SDK_INT > 22) {
if(ContextCompat.checkSelfPermission(getContext(),
Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
}
else{
callIntent();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
143396 次 |
| 最近记录: |