Skip to content

Commit c17833c

Browse files
author
maqiang
committed
1、修改8.0系统上透明activity引起的bug 2、targetSDK升级到28 3、支持在util类中的非静态方法中申请权限
1 parent 68eb4cf commit c17833c

File tree

11 files changed

+234
-24
lines changed

11 files changed

+234
-24
lines changed

app/build.gradle

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ apply plugin: 'com.android.application'
22
apply plugin: 'android-aspectjx'
33

44
android {
5-
compileSdkVersion 25
6-
buildToolsVersion "26.0.3"
5+
compileSdkVersion 28
6+
buildToolsVersion "28.0.3"
77

88
defaultConfig {
99
applicationId "com.ninetripods.aopermission"
1010
minSdkVersion 15
11-
targetSdkVersion 23
12-
versionCode 1100
13-
versionName "1.1"
11+
targetSdkVersion 28
12+
versionCode 1200
13+
versionName "1.2.0"
1414
}
1515
buildTypes {
1616
release {
@@ -33,7 +33,7 @@ aspectjx {
3333
dependencies {
3434
compile project(':permissionlib')
3535
compile fileTree(dir: 'libs', include: ['*.jar'])
36-
compile 'com.android.support:appcompat-v7:25.1.0'
36+
compile 'com.android.support:appcompat-v7:28.0.0'
3737
compile 'com.android.support.constraint:constraint-layout:1.0.2'
38-
compile 'com.android.support:support-v4:25.1.0'
38+
compile 'com.android.support:support-v4:28.0.0'
3939
}

app/src/main/java/com/ninetripods/aopermission/MainActivity.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.ninetripods.aopermission.permissionlib.bean.DenyBean;
1919
import com.ninetripods.aopermission.permissionlib.util.SettingUtil;
2020

21-
import java.util.Arrays;
2221
import java.util.List;
2322

2423

@@ -85,8 +84,6 @@ private void callMap() {
8584
@PermissionDenied
8685
public void dealPermission(DenyBean bean) {
8786
if (bean == null) return;
88-
Toast.makeText(this, "requestCode:" + bean.getRequestCode()
89-
+ ",Permissions: " + Arrays.toString(bean.getDenyList().toArray()), Toast.LENGTH_SHORT).show();
9087
List<String> denyList = bean.getDenyList();
9188
switch (bean.getRequestCode()) {
9289
case 10:
@@ -151,7 +148,7 @@ public void onClick(DialogInterface dialog, int which) {
151148
*/
152149
@PermissionCanceled
153150
public void dealCancelPermission(CancelBean bean) {
154-
Toast.makeText(this, "requestCode:" + bean.getRequestCode(), Toast.LENGTH_SHORT).show();
151+
Toast.makeText(this, "权限申请被取消,请求码 :" + bean.getRequestCode(), Toast.LENGTH_SHORT).show();
155152
}
156153

157154
/**
@@ -164,4 +161,13 @@ public void startPermissionService(View view) {
164161
startService(intent);
165162
}
166163

164+
/**
165+
* 在util类中的非静态方法中申请
166+
*
167+
* @param view
168+
*/
169+
public void requestByUtil(View view) {
170+
RequestPermissionByUtil util = new RequestPermissionByUtil();
171+
util.requestPermission(this);
172+
}
167173
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.ninetripods.aopermission;
2+
3+
import android.Manifest;
4+
import android.app.AlertDialog;
5+
import android.content.Context;
6+
import android.content.DialogInterface;
7+
import android.widget.Toast;
8+
9+
import com.ninetripods.aopermission.permissionlib.annotation.NeedPermission;
10+
import com.ninetripods.aopermission.permissionlib.annotation.PermissionCanceled;
11+
import com.ninetripods.aopermission.permissionlib.annotation.PermissionDenied;
12+
import com.ninetripods.aopermission.permissionlib.bean.CancelBean;
13+
import com.ninetripods.aopermission.permissionlib.bean.DenyBean;
14+
import com.ninetripods.aopermission.permissionlib.util.SettingUtil;
15+
16+
17+
/**
18+
* Created by mq on 2019-06-11 19:58
19+
20+
*/
21+
public class RequestPermissionByUtil {
22+
23+
24+
@NeedPermission(value = {Manifest.permission.CAMERA})
25+
public void requestPermission(Context context) {
26+
Toast.makeText(context, "相机权限申请成功", Toast.LENGTH_SHORT).show();
27+
}
28+
29+
/**
30+
* 权限被取消
31+
*
32+
* @param bean CancelBean
33+
*/
34+
@PermissionCanceled
35+
public void dealCancelPermission(CancelBean bean) {
36+
Toast.makeText(bean.getContext(), "相机权限申请被取消,请求码 :" + bean.getRequestCode(), Toast.LENGTH_SHORT).show();
37+
}
38+
39+
/**
40+
* 权限被拒绝
41+
*
42+
* @param denyBean DenyBean
43+
*/
44+
@PermissionDenied
45+
public void dealDeniedPermission(DenyBean denyBean) {
46+
47+
final Context context = denyBean.getContext();
48+
49+
new AlertDialog.Builder(context)
50+
.setTitle("提示")
51+
.setMessage("相机权限被禁止,需要手动打开")
52+
.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
53+
@Override
54+
public void onClick(DialogInterface dialog, int which) {
55+
dialog.dismiss();
56+
SettingUtil.go2Setting(context);
57+
}
58+
})
59+
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
60+
@Override
61+
public void onClick(DialogInterface dialog, int which) {
62+
dialog.dismiss();
63+
}
64+
})
65+
.create().show();
66+
67+
}
68+
69+
70+
}

app/src/main/res/layout/activity_main.xml

+16
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,22 @@
5151
android:onClick="startPermissionService"
5252
android:text="启动Service" />
5353

54+
55+
<TextView
56+
android:layout_width="wrap_content"
57+
android:layout_height="wrap_content"
58+
android:layout_marginTop="20dp"
59+
android:text="在Util类中申请权限"
60+
android:textSize="18dp" />
61+
62+
<Button
63+
android:layout_width="wrap_content"
64+
android:layout_height="wrap_content"
65+
android:layout_margin="10dp"
66+
android:layout_marginTop="20dp"
67+
android:onClick="requestByUtil"
68+
android:text="通过util申请权限" />
69+
5470
<TextView
5571
android:layout_width="wrap_content"
5672
android:layout_height="wrap_content"

permissionlib/build.gradle

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ apply plugin: 'com.android.library'
22
apply plugin: 'com.novoda.bintray-release'//添加
33

44
android {
5-
compileSdkVersion 25
6-
buildToolsVersion "26.0.3"
5+
compileSdkVersion 28
6+
buildToolsVersion "28.0.3"
77

88
defaultConfig {
99
minSdkVersion 14
10-
targetSdkVersion 23
10+
targetSdkVersion 28
1111
versionCode 1
1212
versionName "1.0"
1313

@@ -28,15 +28,15 @@ android {
2828

2929
dependencies {
3030
compile fileTree(dir: 'libs', include: ['*.jar'])
31-
compile 'com.android.support:appcompat-v7:25.4.0'
31+
compile 'com.android.support:appcompat-v7:28.0.0'
3232
compile 'org.aspectj:aspectjrt:1.8.9'
3333
}
3434

3535
publish {
3636
userOrg = 'crazyqiang'//bintray.com用户名
3737
groupId = 'com.ninetripods'//jCenter上的路径
3838
artifactId = 'aop-permission'//项目名称
39-
publishVersion = '1.1.0'//修改版本号
39+
publishVersion = '1.2.0'//修改版本号
4040
desc = 'A library that request Permissions in an AOP manner'//描述,不重要
4141
website = 'https://github.com/crazyqiang/Aopermission'
4242
}

permissionlib/src/main/AndroidManifest.xml

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<application>
66
<activity
77
android:name="com.ninetripods.aopermission.permissionlib.PermissionRequestActivity"
8-
android:screenOrientation="portrait"
98
android:theme="@style/translucent" />
109
</application>
1110
</manifest>

permissionlib/src/main/java/com/ninetripods/aopermission/permissionlib/PermissionRequestActivity.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import android.app.Activity;
44
import android.content.Context;
55
import android.content.Intent;
6+
import android.content.pm.ActivityInfo;
7+
import android.os.Build;
68
import android.os.Bundle;
79
import android.support.annotation.NonNull;
810
import android.support.v4.app.ActivityCompat;
@@ -48,6 +50,9 @@ public static void PermissionRequest(Context context, String[] permissions, int
4850
protected void onCreate(Bundle savedInstanceState) {
4951
super.onCreate(savedInstanceState);
5052
setContentView(R.layout.activity_request_permission);
53+
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
54+
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
55+
}
5156
Bundle bundle = getIntent().getExtras();
5257
if (bundle != null) {
5358
permissions = bundle.getStringArray(PERMISSION_KEY);
@@ -72,7 +77,7 @@ private void requestPermission(String[] permissions) {
7277
//all permissions granted
7378
if (permissionListener != null) {
7479
permissionListener.PermissionGranted();
75-
permissionListener=null;
80+
permissionListener = null;
7681
}
7782
finish();
7883
overridePendingTransition(0, 0);
@@ -111,7 +116,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
111116
}
112117

113118
}
114-
permissionListener=null;
119+
permissionListener = null;
115120
finish();
116121
overridePendingTransition(0, 0);
117122
}

permissionlib/src/main/java/com/ninetripods/aopermission/permissionlib/aop/PermissionAspect.java

+28-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.ninetripods.aopermission.permissionlib.bean.CancelBean;
1111
import com.ninetripods.aopermission.permissionlib.bean.DenyBean;
1212
import com.ninetripods.aopermission.permissionlib.interf.IPermission;
13+
import com.ninetripods.aopermission.permissionlib.util.Utils;
1314

1415
import org.aspectj.lang.ProceedingJoinPoint;
1516
import org.aspectj.lang.annotation.Around;
@@ -21,12 +22,15 @@
2122
import java.util.List;
2223

2324
/**
25+
* 权限切面Aspect类
2426
* Created by mq on 2018/3/6 上午11:33
2527
2628
*/
2729
@Aspect
2830
public class PermissionAspect {
2931

32+
Context context;
33+
3034
private static final String PERMISSION_REQUEST_POINTCUT =
3135
"execution(@com.ninetripods.aopermission.permissionlib.annotation.NeedPermission * *(..))";
3236

@@ -37,15 +41,32 @@ public void requestPermissionMethod(NeedPermission needPermission) {
3741
@Around("requestPermissionMethod(needPermission)")
3842
public void AroundJoinPoint(final ProceedingJoinPoint joinPoint, NeedPermission needPermission) {
3943

40-
Context context = null;
4144
final Object object = joinPoint.getThis();
45+
if (object == null) return;
46+
4247
if (object instanceof Context) {
4348
context = (Context) object;
4449
} else if (object instanceof Fragment) {
4550
context = ((Fragment) object).getActivity();
4651
} else if (object instanceof android.support.v4.app.Fragment) {
4752
context = ((android.support.v4.app.Fragment) object).getActivity();
53+
} else {
54+
//获取切入点方法上的参数列表
55+
Object[] objects = joinPoint.getArgs();
56+
if (objects.length > 0) {
57+
//非静态方法且第一个参数为context
58+
if (objects[0] instanceof Context) {
59+
context = (Context) objects[0];
60+
} else {
61+
//没有传入context 默认使用application
62+
context = Utils.getApp();
63+
}
64+
} else {
65+
context = Utils.getApp();
66+
}
67+
4868
}
69+
4970
if (context == null || needPermission == null) return;
5071

5172
PermissionRequestActivity.PermissionRequest(context, needPermission.value(),
@@ -63,21 +84,22 @@ public void PermissionGranted() {
6384
public void PermissionDenied(int requestCode, List<String> denyList) {
6485
Class<?> cls = object.getClass();
6586
Method[] methods = cls.getDeclaredMethods();
66-
if (methods == null || methods.length == 0) return;
87+
if (methods.length == 0) return;
6788
for (Method method : methods) {
6889
//过滤不含自定义注解PermissionDenied的方法
6990
boolean isHasAnnotation = method.isAnnotationPresent(PermissionDenied.class);
7091
if (isHasAnnotation) {
7192
method.setAccessible(true);
7293
//获取方法类型
7394
Class<?>[] types = method.getParameterTypes();
74-
if (types == null || types.length != 1) return;
95+
if (types.length != 1) return;
7596
//获取方法上的注解
7697
PermissionDenied aInfo = method.getAnnotation(PermissionDenied.class);
7798
if (aInfo == null) return;
7899
//解析注解上对应的信息
79100
DenyBean bean = new DenyBean();
80101
bean.setRequestCode(requestCode);
102+
bean.setContext(context);
81103
bean.setDenyList(denyList);
82104
try {
83105
method.invoke(object, bean);
@@ -94,20 +116,21 @@ public void PermissionDenied(int requestCode, List<String> denyList) {
94116
public void PermissionCanceled(int requestCode) {
95117
Class<?> cls = object.getClass();
96118
Method[] methods = cls.getDeclaredMethods();
97-
if (methods == null || methods.length == 0) return;
119+
if (methods.length == 0) return;
98120
for (Method method : methods) {
99121
//过滤不含自定义注解PermissionCanceled的方法
100122
boolean isHasAnnotation = method.isAnnotationPresent(PermissionCanceled.class);
101123
if (isHasAnnotation) {
102124
method.setAccessible(true);
103125
//获取方法类型
104126
Class<?>[] types = method.getParameterTypes();
105-
if (types == null || types.length != 1) return;
127+
if (types.length != 1) return;
106128
//获取方法上的注解
107129
PermissionCanceled aInfo = method.getAnnotation(PermissionCanceled.class);
108130
if (aInfo == null) return;
109131
//解析注解上对应的信息
110132
CancelBean bean = new CancelBean();
133+
bean.setContext(context);
111134
bean.setRequestCode(requestCode);
112135
try {
113136
method.invoke(object, bean);

permissionlib/src/main/java/com/ninetripods/aopermission/permissionlib/bean/CancelBean.java

+11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
package com.ninetripods.aopermission.permissionlib.bean;
22

3+
import android.content.Context;
4+
35
/**
46
* Created by mq on 2018/3/28 下午8:36
57
68
*/
79

810
public class CancelBean {
911
private int requestCode;
12+
private Context context;
13+
14+
public Context getContext() {
15+
return context;
16+
}
17+
18+
public void setContext(Context context) {
19+
this.context = context;
20+
}
1021

1122
public int getRequestCode() {
1223
return requestCode;

permissionlib/src/main/java/com/ninetripods/aopermission/permissionlib/bean/DenyBean.java

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ninetripods.aopermission.permissionlib.bean;
22

3+
import android.content.Context;
4+
35
import java.util.List;
46

57
/**
@@ -11,6 +13,15 @@ public class DenyBean {
1113

1214
private int requestCode;
1315
private List<String> denyList;
16+
private Context context;
17+
18+
public Context getContext() {
19+
return context;
20+
}
21+
22+
public void setContext(Context context) {
23+
this.context = context;
24+
}
1425

1526
public int getRequestCode() {
1627
return requestCode;

0 commit comments

Comments
 (0)