soulqw / soulpermission Goto Github PK
View Code? Open in Web Editor NEWa permission check or request for android
a permission check or request for android
在Fragment中网络请求时,调用申请设备标识时遇到FragmentManager被占用从而闪退,希望大佬能帮忙解决一下
错误信息:
2019-06-21 14:32:39.432 18707-18707/com.myworld.p.account E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myworld.p.account, PID: 18707
java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2267)
at androidx.fragment.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:814)
at com.qw.soul.permission.request.PermissionFragmentFactory.create(PermissionFragmentFactory.java:27)
at com.qw.soul.permission.request.PermissionRequester.(PermissionRequester.java:27)
at com.qw.soul.permission.SoulPermission.requestRuntimePermission(SoulPermission.java:364)
at com.qw.soul.permission.SoulPermission.access$000(SoulPermission.java:33)
at com.qw.soul.permission.SoulPermission$3.onStatusOk(SoulPermission.java:352)
at com.qw.soul.permission.SoulPermission.checkStatusBeforeDoSomething(SoulPermission.java:345)
at com.qw.soul.permission.SoulPermission.requestPermissions(SoulPermission.java:349)
at com.qw.soul.permission.SoulPermission.checkAndRequestPermissions(SoulPermission.java:174)
at com.qw.soul.permission.SoulPermission.checkAndRequestPermission(SoulPermission.java:140)
at com.myworld.lib.code.utils.SystemUtils.getDeviceId(SystemUtils.java:114)
项目需要使用热更新,打基准包的时候会出现 获取权限无反应的情况
ps:当时我是需要获取相机权限,点击后无反应,版本号是:1.2.2
改换成之前的老版本 1.1.8则可以申请成功
hi!
看了SoulPermission很赞,然遇到下面两个问题:
1、权限检测中弹层的提示文案需要可配置、
2、“点击【拒绝】后不再提示”功能入口是否启用可控
不知SoulPermission是否可以覆盖上面两点?
Thinks!
存储权限android.Manifest.permission.READ_EXTERNAL_STORAGE 、android.Manifest.permission.WRITE_EXTERNAL_STORAGE 的检测问题
①在小米手机4.4的系统中 READ权限返回false ,WRITE权限返回true
②在华为手机4.4的系统中 READ权限返回true,WRITE权限返回true
③用系统的ContextCompat.checkSelfPermission(context, permission)方法检查时,在两个手机中READ权限和WRITE权限都返回true
原因:检查后发现是调用反射方法checkOp(int op)在两个手机中的结果不一致,关于这个有什么好的解决办法没?
看到这个库时,有点nice,但...
PermissionTools.class
1,vivo的doStartApplicationWithPackageName(context, "com.bairenkeji.icaller");白人科技包名从哪来?我抓到的vivo z1设置包, //com.vivo.permissionmanager/com.vivo.permissionmanager.activity.SoftPermissionDetailActivity
代码可以用com.vivo.permissionmanager 。但是测试发现不行,不能跳到权限详情页,估计 marked it as not exported。
2,小米判断,v567,v8,9,10,少个FLAG_ACTIVITY_NEW_TASK,否则会报错,还有那个return语句,严谨点哈
if ("V5".equals(rom) ||"V6".equals(rom) || "V7".equals(rom)) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
} else if ("V8".equals(rom) || "V9".equals(rom) || "V10".equals(rom)) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
} else {
goOtherIntentSetting(context);
return;
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
3,doStartApplicationWithPackageName()方法里,第一个catch里 逻辑少个return。
4, 其他几个品牌手机待验证,其他其他人补充下
我在fragment中请求了一个拨电话的权限,但是楼主的onPermissionDenied()方法并没有走这个流程啊
RT
Hi, soulqw
我的使用场景是,启动Activity的onCreate()函数中检查并开启camera权限,问题现象如标题所描述。
MainActivity.java代码:
package com.zhuozhang.delta;
import android.Manifest;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.qw.soul.permission.SoulPermission;
import com.qw.soul.permission.bean.Permission;
import com.qw.soul.permission.bean.Permissions;
import com.qw.soul.permission.callbcak.CheckRequestPermissionsListener;
import java.io.IOException;
@SuppressWarnings("deprecation")
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private static final String TAG = "ChrisAcvitity";
private Camera mCamera;
private SurfaceHolder mHolder;
private SurfaceView mView;
void check_permission(){
SoulPermission.getInstance().checkAndRequestPermissions(
Permissions.build(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE),
//if you want do noting or no need all the callbacks you may use SimplePermissionsAdapter instead
new CheckRequestPermissionsListener() {
@Override
public void onAllPermissionOk(Permission[] allPermissions) {
Toast.makeText(MainActivity.this, allPermissions.length + "permissions is ok" +
" \n you can do your operations", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionDenied(Permission[] refusedPermissions) {
Toast.makeText(MainActivity.this, refusedPermissions[0].toString() +
" \n is refused you can not do next things", Toast.LENGTH_SHORT).show();
}
});
}
@Override
// 创建Activity时执行的动作
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
check_permission();
mView = (SurfaceView) findViewById(R.id.surfaceView);
mHolder = mView.getHolder();
mHolder.addCallback(this);
}
@Override
// apk暂停时执行的动作:把相机关闭,避免占用导致其他应用无法使用相机
protected void onPause() {
super.onPause();
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
// 恢复apk时执行的动作
protected void onResume() {
super.onResume();
if (null!=mCamera){
mCamera = getCameraInstance();
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch(IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
}
// SurfaceHolder.Callback必须实现的方法
public void surfaceCreated(SurfaceHolder holder){
mCamera = getCameraInstance();
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch(IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
// SurfaceHolder.Callback必须实现的方法
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
refreshCamera();
int rotation = getDisplayOrientation(); //获取当前窗口方向
mCamera.setDisplayOrientation(rotation); //设定相机显示方向
}
// SurfaceHolder.Callback必须实现的方法
public void surfaceDestroyed(SurfaceHolder holder){
mHolder.removeCallback(this);
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
// === 以下是各种辅助函数 ===
// 获取camera实例
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
} catch(Exception e){
Log.d("TAG", "camera is not available");
}
return c;
}
// 获取当前窗口管理器显示方向
private int getDisplayOrientation(){
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int rotation = display.getRotation();
int degrees = 0;
switch (rotation){
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
android.hardware.Camera.CameraInfo camInfo =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, camInfo);
int result = (camInfo.orientation - degrees + 360) % 360;
return result;
}
// 刷新相机
private void refreshCamera(){
if (mHolder.getSurface() == null){
// preview surface does not exist
return;
}
// stop preview before making changes
try {
mCamera.stopPreview();
} catch(Exception e){
// ignore: tried to stop a non-existent preview
}
// set preview size and make any resize, rotate or
// reformatting changes here
// start preview with new settings
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
}
}
}
对应的layout为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
build.gradle
信息:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.1"
defaultConfig {
applicationId "com.zhuozhang.delta"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:29.0.0'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.qw:soulpermission:1.2.0_x'
}
请问,我使用SoulPermission的方式是否有误?有什么修改建议吗?P.S.本人android小白,对这块不太了解。
您好,请问引入需要配置混淆么
有国际版项目用到,走的dependencies方式引用的,需要适配一下英文版
知道解决方法,但是感觉大佬应该可以优化下
我在申请定位权限时,发现如果定位权限允许,但是手机关闭位置开关,这样默认返回true,拦不住
红米机型跳转权限设置页面,设置权限后返回,应用闪退。
在红米5A上,拒绝权限后,当前界面被关闭了,不知道什么情况啊
适配android13的 新动态权限了吗
华为Mate20 设置了权限 还是一直提示没得权限
不管怎样,先star一个再说,再运行下看看好用不
在vivo手机上,系统弹窗后,用户禁止,不再提示; 当再次点击时,不显示出授权弹窗;
RECORD_AUDIO被识别为未知权限了,希望能补全所有危险权限分组描述。
如题
我是在请求摄像头拍照录像权限,时发现的问题,
测试手机为oppo android 5.1 请求拍照权限会调起是否允许的界面,未选择情况下,还是会执行后续操作,请大神指点
您好,测试手机 Redmi Note3 Android版本 5.0.2发现以下问题
在设置中修改相机权限修改为“提示”时,checkAndRequestPermission判定结果为onPermissionDenied,能不能支持AppOpps可配置,或者直接6.0以下直接返回onPermissionOk?
WRITE_SETTINGS 修改系统设置
这个特殊权限没有加上,
在用户拒绝请求后我让他直接跳转到设置页面手动打开权限,然后他并没有手动打开,直接点击back键返回到权限请求页面,这种情况不执行oncreate 方法,那么在onresume方法中应该如何处理?请大神指点。
您好,能供检查某个权限组的API么?直接返回全部通过的结果,或者全部不通过。建议可以参考blankj库的写法,
在使用中发现打出的release包,试运行,可以弹出权限,但是这个release包再用腾讯的乐固加固并签名后,再运行就出现权限申请不执行的问题,不知道什么原因,使用自带的权限申请方式正常
简单看了下代码,思路还是很棒的!!!
空的Fragment请求完毕权限是不是应该解绑掉释放下占用资源会好点呢?
或者我没看到这个部分逻辑。
public static void detachFragment(Object obj) { if (obj instanceof android.support.v4.app.Fragment) { android.support.v4.app.Fragment fragmentSupport = (android.support.v4.app.Fragment) obj; if (!fragmentSupport.isAdded()) return; android.support.v4.app.FragmentTransaction transaction = fragmentSupport.getFragmentManager().beginTransaction(); transaction.detach(fragmentSupport); transaction.remove(fragmentSupport); transaction.commitAllowingStateLoss(); } else if (obj instanceof android.app.Fragment) { android.app.Fragment fragmentApp = (android.app.Fragment) obj; if (!fragmentApp.isAdded()) return; android.app.FragmentTransaction fragmentTransaction = fragmentApp.getFragmentManager().beginTransaction(); fragmentTransaction.detach(fragmentApp); fragmentTransaction.remove(fragmentApp); fragmentTransaction.commitAllowingStateLoss(); } }
Caused by java.lang.IllegalStateException
Fragment PermissionSupportFragment{887e6f3 (9c5e099d-054c-4bf9-9a52-0357cecc6cea) permission_fragment_tag} not attached to Activity
Fatal Exception: java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1686)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1716)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:323)
at com.qw.soul.permission.request.PermissionFragmentFactory.create(PermissionFragmentFactory.java:35)
at com.qw.soul.permission.request.PermissionRequester.(PermissionRequester.java:29)
at com.qw.soul.permission.SoulPermission.requestRuntimePermission(SoulPermission.java:405)
at com.qw.soul.permission.SoulPermission.access$000(SoulPermission.java:41)
at com.qw.soul.permission.SoulPermission$4.onStatusOk(SoulPermission.java:398)
at com.qw.soul.permission.SoulPermission.checkStatusBeforeDoSomething(SoulPermission.java:391)
at com.qw.soul.permission.SoulPermission.requestPermissions(SoulPermission.java:395)
at com.qw.soul.permission.SoulPermission.checkAndRequestPermissions(SoulPermission.java:208)
at common.permission.Permissioner.requestPermissions(Permissioner.kt:36)
at common.permission.Permissioner.requestStoragePermission(Permissioner.kt:57)
at com..requestPermission(.kt:79)
at com..onLazyCreate(.kt:55)
at com..lazyCreate(LazyFragment.kt:58)
at com..onResume(LazyFragment.kt:48)
at com.*.onResume(BaseFragment.kt:13)
at androidx.fragment.app.Fragment.performResume(Fragment.java:3180)
at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:606)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:285)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1808)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1720)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:317)
at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(FragmentStateAdapter.java:726)
at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer$1.onPageScrollStateChanged(FragmentStateAdapter.java:632)
at androidx.viewpager2.widget.CompositeOnPageChangeCallback.onPageScrollStateChanged(CompositeOnPageChangeCallback.java:87)
at androidx.viewpager2.widget.CompositeOnPageChangeCallback.onPageScrollStateChanged(CompositeOnPageChangeCallback.java:87)
at androidx.viewpager2.widget.ScrollEventAdapter.dispatchStateChanged(ScrollEventAdapter.java:426)
at androidx.viewpager2.widget.ScrollEventAdapter.onScrolled(ScrollEventAdapter.java:214)
at androidx.recyclerview.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:5347)
at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5512)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1034)
at android.view.Choreographer.doCallbacks(Choreographer.java:858)
at android.view.Choreographer.doFrame(Choreographer.java:785)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1019)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7912)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
机型:vivo X7
版本:Android 7.1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = findViewById(R.id.main_text_view);
SoulPermission.getInstance().checkAndRequestPermissions(
Permissions.build(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
),
//if you want do noting or no need all the callbacks you may use SimplePermissionsAdapter instead
new CheckRequestPermissionsListener() {
@Override
public void onAllPermissionOk(Permission[] allPermissions) {
Location location = Util.getLocation(MainActivity.this);
String str = "Latitude>>>>" + location.getLatitude() + "\nLongitude" + location.getLongitude();
textView.setText(str);
Log.d(TAG, str);
}
@Override
public void onPermissionDenied(Permission[] refusedPermissions) {
Toast.makeText(MainActivity.this, "授权失败", Toast.LENGTH_SHORT).show();
}
});
}
异常信息:
2019-06-04 21:15:43.779 18381-18381/com.hyfun.soulpermission E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hyfun.soulpermission, PID: 18381
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hyfun.soulpermission/com.hyfun.soulpermission.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2845)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1562)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6306)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1108)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:998)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at com.hyfun.soulpermission.MainActivity$1.onAllPermissionOk(MainActivity.java:36)
at com.qw.soul.permission.SoulPermission.checkAndRequestPermissions(SoulPermission.java:169)
at com.hyfun.soulpermission.MainActivity.onCreate(MainActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6804)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2737)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2845)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1562)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6306)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1108)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:998)
```
描述:进入MainActivity后,在onCreate方法中调用,拒绝后会回调onAllPermissionOk(Permission[] allPermissions)方法,所以才会造成空指针异常
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.