Giter Club home page Giter Club logo

soulpermission's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

soulpermission's Issues

AppOpps判定不准确

您好,测试手机 Redmi Note3 Android版本 5.0.2发现以下问题
在设置中修改相机权限修改为“提示”时,checkAndRequestPermission判定结果为onPermissionDenied,能不能支持AppOpps可配置,或者直接6.0以下直接返回onPermissionOk?

申请权限时出现闪退,FragmentManager被占用

在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)

跳转设置bug....,太不走心了

看到这个库时,有点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, 其他几个品牌手机待验证,其他其他人补充下

打基准包会出现问题

项目需要使用热更新,打基准包的时候会出现 获取权限无反应的情况
ps:当时我是需要获取相机权限,点击后无反应,版本号是:1.2.2
改换成之前的老版本 1.1.8则可以申请成功

校验提示文案、拒绝后不再提示入口

hi!
看了SoulPermission很赞,然遇到下面两个问题:
1、权限检测中弹层的提示文案需要可配置、
2、“点击【拒绝】后不再提示”功能入口是否启用可控

不知SoulPermission是否可以覆盖上面两点?

Thinks!

能供检查权限组的API么?

您好,能供检查某个权限组的API么?直接返回全部通过的结果,或者全部不通过。建议可以参考blankj库的写法,

暂时没有发现异常,但是有个问题想要请教大神

在用户拒绝请求后我让他直接跳转到设置页面手动打开权限,然后他并没有手动打开,直接点击back键返回到权限请求页面,这种情况不执行oncreate 方法,那么在onresume方法中应该如何处理?请大神指点。

定位权限问题

我在申请定位权限时,发现如果定位权限允许,但是手机关闭位置开关,这样默认返回true,拦不住

1.3.1版本 FragmentManager is already executing transactions

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)

小米4.4 存储权限 android.Manifest.permission.READ_EXTERNAL_STORAGE 返回false

存储权限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)在两个手机中的结果不一致,关于这个有什么好的解决办法没?

闪退

红米机型跳转权限设置页面,设置权限后返回,应用闪退。

腾讯乐固加固后不执行申请权限的问题

在使用中发现打出的release包,试运行,可以弹出权限,但是这个release包再用腾讯的乐固加固并签名后,再运行就出现权限申请不执行的问题,不知道什么原因,使用自带的权限申请方式正常

对Fragment请求权限有个疑问

简单看了下代码,思路还是很棒的!!!
空的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(); } }

Vivo手机授权失败Crash

机型: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)方法,所以才会造成空指针异常

apk第一次启动闪退,添加权限后,后续每次都可以打开

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小白,对这块不太了解。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.