api(runtime): runtime.requestPermissions()
This commit is contained in:
@@ -17,6 +17,12 @@
|
||||
android:theme="@style/AppTheme"/>
|
||||
|
||||
|
||||
<activity
|
||||
android:name="com.stardust.autojs.core.permission.PermissionRequestActivity"
|
||||
android:excludeFromRecents="true"
|
||||
android:taskAffinity="com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity"
|
||||
android:theme="@style/AppTheme.Transparent"/>
|
||||
|
||||
<activity
|
||||
android:name="com.stardust.autojs.core.image.capture.ScreenCaptureRequestActivity"
|
||||
android:excludeFromRecents="true"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.stardust.autojs.core.permission;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
public interface OnRequestPermissionsResultCallback {
|
||||
|
||||
void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.stardust.autojs.core.permission;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.RequiresApi;
|
||||
|
||||
public class PermissionRequestActivity extends Activity {
|
||||
|
||||
public static final String EXTRA_PERMISSIONS = "permissions";
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
String[] permissions = getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
|
||||
if (permissions == null || permissions.length == 0) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
requestPermissions(permissions, Permissions.REQUEST_CODE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.stardust.autojs.core.permission;
|
||||
|
||||
import android.os.Build;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.RequiresApi;
|
||||
|
||||
public interface PermissionRequestProxyActivity {
|
||||
|
||||
void addRequestPermissionsCallback(OnRequestPermissionsResultCallback callback);
|
||||
|
||||
boolean removeRequestPermissionsCallback(OnRequestPermissionsResultCallback callback);
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.M)
|
||||
void requestPermissions(@NonNull String[] permissions, int requestCode);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.stardust.autojs.core.permission;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.RequiresApi;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static android.content.pm.PackageManager.PERMISSION_DENIED;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
public class Permissions {
|
||||
|
||||
private static final String[] EMPTY_STRING_ARRAY = new String[0];
|
||||
|
||||
static final int REQUEST_CODE = 18777;
|
||||
|
||||
public static String[] getPermissionsNeedToRequest(Context context, String[] permissions) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
return EMPTY_STRING_ARRAY;
|
||||
}
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
for (String permission : permissions) {
|
||||
if (!permission.startsWith("android.permission.")) {
|
||||
permission = "android.permission." + permission.toUpperCase();
|
||||
}
|
||||
if (context.checkSelfPermission(permission) == PERMISSION_DENIED) {
|
||||
list.add(permission);
|
||||
}
|
||||
}
|
||||
return list.toArray(EMPTY_STRING_ARRAY);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
public static void requestPermissions(PermissionRequestProxyActivity activity, String[] permissions, OnRequestPermissionsResultCallback callback) {
|
||||
if (callback != null) {
|
||||
activity.addRequestPermissionsCallback((code, p, grantResults) -> {
|
||||
activity.removeRequestPermissionsCallback(callback);
|
||||
callback.onRequestPermissionsResult(code, p, grantResults);
|
||||
});
|
||||
}
|
||||
activity.requestPermissions(permissions, REQUEST_CODE);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
public static void requestPermissions(Context context, String[] permissions) {
|
||||
context.startActivity(new Intent(context, PermissionRequestActivity.class)
|
||||
.putExtra(PermissionRequestActivity.EXTRA_PERMISSIONS, permissions)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.stardust.autojs.core.permission;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RequestPermissionCallbacks {
|
||||
|
||||
private List<OnRequestPermissionsResultCallback> mCallbacks = new ArrayList<>();
|
||||
|
||||
|
||||
public void addCallback(OnRequestPermissionsResultCallback callback) {
|
||||
mCallbacks.add(callback);
|
||||
}
|
||||
|
||||
|
||||
public boolean removeCallback(OnRequestPermissionsResultCallback callback) {
|
||||
return mCallbacks.remove(callback);
|
||||
}
|
||||
|
||||
public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
if (mCallbacks.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
for (OnRequestPermissionsResultCallback callback : mCallbacks) {
|
||||
callback.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.stardust.autojs.runtime;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Looper;
|
||||
@@ -10,6 +12,8 @@ import com.stardust.autojs.ScriptEngineService;
|
||||
import com.stardust.autojs.annotation.ScriptVariable;
|
||||
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
||||
import com.stardust.autojs.core.image.Colors;
|
||||
import com.stardust.autojs.core.permission.PermissionRequestProxyActivity;
|
||||
import com.stardust.autojs.core.permission.Permissions;
|
||||
import com.stardust.autojs.rhino.AndroidClassLoader;
|
||||
import com.stardust.autojs.runtime.api.AbstractShell;
|
||||
import com.stardust.autojs.runtime.api.AppUtils;
|
||||
@@ -49,9 +53,13 @@ import org.mozilla.javascript.ContextFactory;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static android.content.pm.PackageManager.PERMISSION_DENIED;
|
||||
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/1/27.
|
||||
@@ -305,6 +313,17 @@ public class ScriptRuntime {
|
||||
}
|
||||
}
|
||||
|
||||
public void requestPermissions(String[] permissions) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
return;
|
||||
}
|
||||
Context context = uiHandler.getContext();
|
||||
permissions = Permissions.getPermissionsNeedToRequest(context, permissions);
|
||||
if (permissions.length == 0)
|
||||
return;
|
||||
Permissions.requestPermissions(context, permissions);
|
||||
}
|
||||
|
||||
public void loadJar(String path) {
|
||||
try {
|
||||
((AndroidClassLoader) ContextFactory.getGlobal().getApplicationClassLoader()).loadJar(new File(path));
|
||||
|
||||
Reference in New Issue
Block a user