diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..d244a3a Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index de24430..7a8e390 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,10 @@ + - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 436e7e2..726ced0 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,9 @@ + + + diff --git a/README.md b/README.md index 0ffc723..e5333eb 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ ### OneKeyPerm接入说明 -` compile 'com.wanjian:onekeyperm:0.0.3' ` - + OneKeyPerm不依赖任何业务Activity,支持多进程,只需一句静态代码就可以了 @@ -14,7 +13,7 @@ OneKeyPerm不依赖任何业务Activity,支持多进程,只需一句静态 ```java 申请权限被拒绝后 不会 自动开启设置页面让用户手动开启权限 -OneKeyPerm.request(Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { +OneKeyPerm.request(application, Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { Toast.makeText(MainActivity.this, "请求相机权限 " + isGrant, Toast.LENGTH_SHORT).show(); @@ -27,7 +26,7 @@ OneKeyPerm.request(Manifest.permission.CAMERA, "您需要允许相机权限, ```java 申请权限被拒绝后 会 自动开启设置页面让用户手动开启权限 -OneKeyPerm.request(Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { +OneKeyPerm.request(application, Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { Toast.makeText(MainActivity.this, "请求相机权限 " + isGrant, Toast.LENGTH_SHORT).show(); @@ -35,75 +34,13 @@ OneKeyPerm.request(Manifest.permission.CAMERA, "您需要允许相机权限, },true); ``` -### 接入 - -* 在清单中添加自定义权限,例如: - -```html - - - - - - - - - - - - - -``` - -其中: -permission节点中name要替换成你的app的`包名.permission.ONE_KEY_PERM`, -uses-permission节点中的name也要替换成你的app的`包名.permission.ONE_KEY_PERM` - -* 在Application中调用 ` OneKeyPerm.install(this);`初始化,例如 - -```java - - -public class App extends Application { - - @Override - public void onCreate() { - super.onCreate(); - OneKeyPerm.install(this); - } -} - - -``` -* 如果manifest.xml没有配置`ONE_KEY_PERM`权限的话,运行app会报错,直接把错误堆栈信息中的权限配置复制到manifest.xml中也可以 - -例如 - -```xml - - FATAL EXCEPTION: main - Process: com.wanjian.permission.demo, PID: 6282 - java.lang.RuntimeException: Unable to create application com.wanjian.permission.demo.App: java.lang.RuntimeException: define and use permission in your manifest ! - example: - - - - -``` - -之后就可以一句话申请权限了 ### 原理分析 * 每次通过context启动透明Activity`(PermissionActivity)`请求权限 -* 当权限被拒绝后启动另一个透明Activity `(WatchAuthorizationActivity)`,在`WatchAuthorizationActivity`中再次启动应用详情设置Activity,然后在`WatchAuthorizationActivity`的`onActivityResult`方法中再次检查是否已经手动授权,并通过广播(解决多进程问题)通知调用者 +* 当权限被拒绝后启动另一个透明Activity `(WatchAuthorizationActivity)`,在`WatchAuthorizationActivity`中再次启动应用详情设置Activity,然后在`WatchAuthorizationActivity`的`onActivityResult`方法中再次检查是否已经手动授权,并通过Binder(解决多进程问题)通知调用者 备注:收回授权后Android会重启App diff --git a/app/build.gradle b/app/build.gradle index 209b595..008102d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,5 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:26+' implementation 'com.android.support.constraint:constraint-layout:1.0.2' -// implementation project(':permission') -// https://jcenter.bintray.com/com/wanjian/onekeyperm/0.0.1/ - compile 'com.wanjian:onekeyperm:0.0.3' + implementation project(':permission') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 44e66c1..1843fd9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,14 +2,6 @@ - - - - - - diff --git a/app/src/main/java/com/wanjian/permission/demo/App.java b/app/src/main/java/com/wanjian/permission/demo/App.java index 4143650..2c8ac22 100644 --- a/app/src/main/java/com/wanjian/permission/demo/App.java +++ b/app/src/main/java/com/wanjian/permission/demo/App.java @@ -13,6 +13,5 @@ public class App extends Application { @Override public void onCreate() { super.onCreate(); - OneKeyPerm.install(this); } } diff --git a/app/src/main/java/com/wanjian/permission/demo/MainActivity.java b/app/src/main/java/com/wanjian/permission/demo/MainActivity.java index 6ad636d..906a667 100644 --- a/app/src/main/java/com/wanjian/permission/demo/MainActivity.java +++ b/app/src/main/java/com/wanjian/permission/demo/MainActivity.java @@ -22,7 +22,7 @@ protected void onCreate(Bundle savedInstanceState) { findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - OneKeyPerm.request(Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { + OneKeyPerm.request(getApplication(), Manifest.permission.CAMERA, "您需要允许相机权限,否则无法使用扫码功能", new OneKeyPerm.OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { Toast.makeText(MainActivity.this, "请求相机权限 " + isGrant, Toast.LENGTH_SHORT).show(); @@ -34,7 +34,7 @@ public void onPermResult(String perm, boolean isGrant) { findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - OneKeyPerm.request(Manifest.permission.READ_EXTERNAL_STORAGE, "您需要允许读取文件权限,否则无法查看图片", new OneKeyPerm.OnPermResultListener() { + OneKeyPerm.request(getApplication(), Manifest.permission.READ_EXTERNAL_STORAGE, "您需要允许读取文件权限,否则无法查看图片", new OneKeyPerm.OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { Toast.makeText(MainActivity.this, "请求读取权限 " + isGrant, Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/wanjian/permission/demo/SecondAct.java b/app/src/main/java/com/wanjian/permission/demo/SecondAct.java index 154b073..6da5589 100644 --- a/app/src/main/java/com/wanjian/permission/demo/SecondAct.java +++ b/app/src/main/java/com/wanjian/permission/demo/SecondAct.java @@ -28,7 +28,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - OneKeyPerm.request(Manifest.permission.READ_EXTERNAL_STORAGE, "需要读取文件", new OneKeyPerm.OnPermResultListener() { + OneKeyPerm.request(getApplication(), Manifest.permission.READ_EXTERNAL_STORAGE, "需要读取文件", new OneKeyPerm.OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { Toast.makeText(SecondAct.this, "请求读取权限 " + isGrant, Toast.LENGTH_SHORT).show(); diff --git a/build.gradle b/build.gradle index e6b32bc..ac470f7 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.6.1' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f0a4e09..1a1b711 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Dec 29 16:28:14 CST 2017 +#Mon Aug 10 21:27:31 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/permission/build.gradle b/permission/build.gradle index f0f23bc..2d0ebc4 100644 --- a/permission/build.gradle +++ b/permission/build.gradle @@ -29,9 +29,10 @@ dependencies { buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.6.1' classpath 'com.novoda:bintray-release:0.8.0' } } diff --git a/permission/src/main/java/com/wanjian/permission/Check.java b/permission/src/main/java/com/wanjian/permission/Check.java deleted file mode 100644 index 001ddb6..0000000 --- a/permission/src/main/java/com/wanjian/permission/Check.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.wanjian.permission; - -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PermissionInfo; -import android.support.v4.content.ContextCompat; - -import static android.content.pm.PermissionInfo.PROTECTION_SIGNATURE; - -/** - * Created by wanjian on 2018/1/9. - */ - -class Check { - static void hasDefinePermission(Context context) { - try { - String packName = context.getPackageName(); - String perm = packName.concat(".permission.ONE_KEY_PERM"); - PackageManager pm = context.getPackageManager(); - - PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); - - if (pi.permissions == null) { - log(packName); - return; - } - for (PermissionInfo permission : pi.permissions) { - if (perm.equals(permission.name) - && permission.protectionLevel == PROTECTION_SIGNATURE - && ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED) { - return; - } - } - log(packName); - } catch (Exception e) { - e.printStackTrace(); - } - - - } - - private static void log(String packName) { - String definePerm = (" ").replace("$", packName); - - - String usePerm = " \n".replace("$", packName); - - new RuntimeException("define and use permission in your manifest ! \nexample:\n".concat(definePerm).concat("\n").concat(usePerm)).printStackTrace(); - } -} diff --git a/permission/src/main/java/com/wanjian/permission/OneKeyPerm.java b/permission/src/main/java/com/wanjian/permission/OneKeyPerm.java index 450fa3d..c7ec117 100644 --- a/permission/src/main/java/com/wanjian/permission/OneKeyPerm.java +++ b/permission/src/main/java/com/wanjian/permission/OneKeyPerm.java @@ -1,12 +1,18 @@ package com.wanjian.permission; import android.app.Application; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.os.Binder; import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Parcel; +import android.os.RemoteException; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; /** @@ -16,27 +22,10 @@ public class OneKeyPerm { static final String TIPS = "tips"; - static String ONE_KEY_PERM; - static String ONE_KEY_PERM_MANU; - static String BROADCAST_PERM; - private static Context sContext; + static final String RECEIVER = "receiver"; + static final String ONE_KEY_PERM = OneKeyPerm.class.getName(); - public static void install(Application application) { - if (application == null) { - throw new IllegalArgumentException("application can not be null !"); - } - sContext = application.getApplicationContext(); - Check.hasDefinePermission(sContext); - ONE_KEY_PERM = sContext.getPackageName() + "/" + OneKeyPerm.class.getName(); - ONE_KEY_PERM_MANU = ONE_KEY_PERM + "/manu/"; - BROADCAST_PERM = sContext.getPackageName() + ".permission.ONE_KEY_PERM"; - } - - public static void request(final String permission, String tips, final OnPermResultListener listener) { - - if (sContext == null) { - throw new IllegalStateException("init OneKeyPerm first !"); - } + public static void request(Context context,final String permission, String tips, final OnPermResultListener listener) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (listener != null) { listener.onPermResult(permission, true); @@ -44,73 +33,84 @@ public static void request(final String permission, String tips, final OnPermRes return; } - int permissionCheck = ContextCompat.checkSelfPermission(sContext, permission); + int permissionCheck = ContextCompat.checkSelfPermission(context, permission); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { if (listener != null) { listener.onPermResult(permission, true); } return; } - String filter = ONE_KEY_PERM + "/" + permission; - sContext.registerReceiver(new BroadcastReceiver() { + Intent intent = new Intent(context, PermissionActivity.class); + intent.putExtra(ONE_KEY_PERM, permission); + intent.putExtra(TIPS, tips); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Bundle bundle = new Bundle(); + bundle.putBinder(RECEIVER, new Binder() { @Override - public void onReceive(Context context, Intent intent) { - sContext.unregisterReceiver(this); + protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) throws RemoteException { if (listener != null) { - int result = intent.getIntExtra(permission, 1); - if (result == PackageManager.PERMISSION_GRANTED || result == PackageManager.PERMISSION_DENIED) { - listener.onPermResult(permission, result == PackageManager.PERMISSION_GRANTED); - } + String permission = data.readString(); + int result = data.readInt(); + setPermResult(listener, permission, result == PackageManager.PERMISSION_GRANTED); } + return true; } - }, new IntentFilter(filter), BROADCAST_PERM, null); + }); + intent.putExtras(bundle); - Intent intent = new Intent(sContext, PermissionActivity.class); - intent.putExtra(ONE_KEY_PERM, permission); - intent.putExtra(TIPS, tips); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - sContext.startActivity(intent); + context.startActivity(intent); } - public static void request(final String permission, final String tips, final OnPermResultListener listener, boolean manualuthorize) { + public static void request(final Context context, final String permission, final String tips, final OnPermResultListener listener, boolean manualuthorize) { if (manualuthorize) { - request(permission, tips, new OnPermResultListener() { + request(context,permission, tips, new OnPermResultListener() { @Override public void onPermResult(String perm, boolean isGrant) { if (!isGrant) { - watchAuthorization(listener, tips, perm); + watchAuthorization(context,listener, tips, perm); } else if (listener != null) { - listener.onPermResult(perm, isGrant); + setPermResult(listener, perm, isGrant); } } }); } else { - request(permission, tips, listener); + request(context,permission, tips, listener); } } - private static void watchAuthorization(final OnPermResultListener listener, String tips, final String permission) { - String filter = ONE_KEY_PERM_MANU + "/" + permission; - sContext.registerReceiver(new BroadcastReceiver() { + private static void watchAuthorization(Context context, final OnPermResultListener listener, String tips, final String permission) { + Intent intent = new Intent(context, WatchAuthorizationActivity.class); + intent.putExtra(ONE_KEY_PERM, permission); + intent.putExtra(TIPS, tips); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Bundle bundle = new Bundle(); + bundle.putBinder(RECEIVER, new Binder() { @Override - public void onReceive(Context context, Intent intent) { - sContext.unregisterReceiver(this); + protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) throws RemoteException { if (listener != null) { - int result = intent.getIntExtra(permission, 1); - if (result == PackageManager.PERMISSION_GRANTED || result == PackageManager.PERMISSION_DENIED) { - listener.onPermResult(permission, result == PackageManager.PERMISSION_GRANTED); - } + String permission = data.readString(); + int result = data.readInt(); + setPermResult(listener, permission, result == PackageManager.PERMISSION_GRANTED); } + return true; } - }, new IntentFilter(filter), BROADCAST_PERM, null); - - Intent intent = new Intent(sContext, WatchAuthorizationActivity.class); - intent.putExtra(ONE_KEY_PERM, permission); - intent.putExtra(TIPS, tips); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - sContext.startActivity(intent); + }); + intent.putExtras(bundle); + context.startActivity(intent); } + private static void setPermResult(final OnPermResultListener listener, final String perm, final boolean result) { + if (Looper.myLooper() == Looper.getMainLooper()) { + listener.onPermResult(perm, result); + } else { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + listener.onPermResult(perm, result); + } + }); + } + } public interface OnPermResultListener { void onPermResult(String perm, boolean isGrant); } diff --git a/permission/src/main/java/com/wanjian/permission/PermissionActivity.java b/permission/src/main/java/com/wanjian/permission/PermissionActivity.java index bdbb1bc..4714f2f 100644 --- a/permission/src/main/java/com/wanjian/permission/PermissionActivity.java +++ b/permission/src/main/java/com/wanjian/permission/PermissionActivity.java @@ -4,6 +4,9 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; @@ -12,8 +15,8 @@ import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; -import static com.wanjian.permission.OneKeyPerm.BROADCAST_PERM; import static com.wanjian.permission.OneKeyPerm.ONE_KEY_PERM; +import static com.wanjian.permission.OneKeyPerm.RECEIVER; import static com.wanjian.permission.OneKeyPerm.TIPS; @@ -23,16 +26,21 @@ public class PermissionActivity extends AppCompatActivity { private final int REQUEST_CODE = 1; - + private IBinder receiver; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); + Bundle bundle = intent.getExtras(); + if (bundle != null) { + receiver = bundle.getBinder(RECEIVER); + } final String perm = intent.getStringExtra(ONE_KEY_PERM); - if (TextUtils.isEmpty(perm)) { + if (TextUtils.isEmpty(perm) || receiver == null) { finish(); return; } + if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) { @@ -59,15 +67,11 @@ public void onClick(DialogInterface dialog, int which) { // result of the request. } } else { - Intent result = new Intent(ONE_KEY_PERM + "/" + perm); - result.putExtra(perm, PackageManager.PERMISSION_GRANTED); - result.setPackage(getPackageName()); - sendBroadcast(result, BROADCAST_PERM); + setResult(perm,PackageManager.PERMISSION_GRANTED); finish(); } } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -78,11 +82,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis // permission was granted, yay! Do the // contacts-related task you need to do. - - Intent intent = new Intent(ONE_KEY_PERM + "/" + permissions[0]); - intent.putExtra(permissions[0], grantResults[0]); - intent.setPackage(getPackageName()); - sendBroadcast(intent, BROADCAST_PERM); + setResult(permissions[0], grantResults[0]); } else { // permission denied, boo! Disable the // functionality that depends on this permission. @@ -93,6 +93,17 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } } + private void setResult(String perm, int result) { + Parcel parcel = Parcel.obtain(); + parcel.writeString(perm); + parcel.writeInt(result); + try { + receiver.transact(0, parcel, Parcel.obtain(), IBinder.FLAG_ONEWAY); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + @Override public void finish() { super.finish(); diff --git a/permission/src/main/java/com/wanjian/permission/WatchAuthorizationActivity.java b/permission/src/main/java/com/wanjian/permission/WatchAuthorizationActivity.java index ed7e0d3..8be9623 100644 --- a/permission/src/main/java/com/wanjian/permission/WatchAuthorizationActivity.java +++ b/permission/src/main/java/com/wanjian/permission/WatchAuthorizationActivity.java @@ -3,6 +3,9 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -10,9 +13,8 @@ import android.text.TextUtils; import android.widget.Toast; -import static com.wanjian.permission.OneKeyPerm.BROADCAST_PERM; import static com.wanjian.permission.OneKeyPerm.ONE_KEY_PERM; -import static com.wanjian.permission.OneKeyPerm.ONE_KEY_PERM_MANU; +import static com.wanjian.permission.OneKeyPerm.RECEIVER; import static com.wanjian.permission.OneKeyPerm.TIPS; /** @@ -61,11 +63,16 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { private void onResult() { - int permState = ContextCompat.checkSelfPermission(this, perm); - Intent result = new Intent(ONE_KEY_PERM_MANU + "/" + perm); - result.putExtra(perm, permState); - result.setPackage(getPackageName()); - sendBroadcast(result, BROADCAST_PERM); + IBinder receiver = getIntent().getExtras().getBinder(RECEIVER); + int result = ContextCompat.checkSelfPermission(this, perm); + Parcel parcel = Parcel.obtain(); + parcel.writeString(perm); + parcel.writeInt(result); + try { + receiver.transact(0, parcel, Parcel.obtain(), IBinder.FLAG_ONEWAY); + } catch (RemoteException e) { + throw new RuntimeException(e); + } finish(); overridePendingTransition(0, 0); }