From cce09209a39d4cf8b8f6b5b8bd23fd0886f2aabe Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 10 Oct 2018 14:49:59 +0800 Subject: [PATCH] fix: exposed uri error --- .idea/caches/build_file_checksums.ser | Bin 733 -> 733 bytes app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 +- .../fileprovider/AppFileProvider.java | 16 ++++++++ .../autojs/autojs/model/script/Scripts.java | 9 +++-- .../ui/main/scripts/MyScriptListFragment.java | 6 +-- app/src/main/res/xml/provider_paths.xml | 2 + autojs/src/main/AndroidManifest.xml | 1 + .../autojs/core/image/OpenCVHelper.java | 17 +++++---- .../stardust/autojs/runtime/api/AppUtils.java | 23 +++++------- build.gradle | 11 ++---- common/release/output.json | 2 +- .../java/com/stardust/util/IntentUtil.java | 35 ++++++++++++++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- inrt/build.gradle | 33 +++++++++++++++++ .../stardust/auojs/inrt/SplashActivity.java | 4 +- project-versions.json | 8 ++++ 17 files changed, 125 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java create mode 100644 project-versions.json diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 99f3a5108d2d6e7c178058b08a27116bf80c4290..85995d5c628d86e1bb64e4c5aa80f5d52bb10222 100644 GIT binary patch delta 77 zcmV-T0J8tx1>FUZm;_vKcfygJcMuO{AoqHi3y9F5YrViD)3TEz0q_v7u7Y^L3+wha j{)L^f>cFX!BLYhhLKQI^boFSAQzpA}2AoP6lYRnUkl!O9 delta 77 zcmV-T0J8tx1>FUZm;_mhnz)gicMv;PIJ%n))_R>7G#^bIZ{Cw50q_uSM|{A3v&m4E jreAT08q*h(BLYhhj>$n24U-{+FL=74aFKGllYRnU`H~<% diff --git a/app/build.gradle b/app/build.gradle index 7e978328..0f381340 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,7 @@ android { + repositories { flatDir { dirs 'libs' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bc3fdf25..ed15d0a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,7 +69,7 @@ diff --git a/app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java b/app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java new file mode 100644 index 00000000..a2c99237 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java @@ -0,0 +1,16 @@ +package org.autojs.autojs.external.fileprovider; + +import android.content.Context; +import android.net.Uri; +import android.support.v4.content.FileProvider; + +import java.io.File; + +public class AppFileProvider extends FileProvider { + + public static final String AUTHORITY = "org.autojs.autojs.fileprovider"; + + public static Uri getUriForFile(Context context, File file){ + return FileProvider.getUriForFile(context, AUTHORITY, file); + } +} diff --git a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java index 9a73962e..6281dfdb 100644 --- a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java +++ b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java @@ -12,11 +12,13 @@ import com.stardust.autojs.execution.ScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.script.ScriptSource; +import com.stardust.util.IntentUtil; import org.autojs.autojs.Pref; import org.autojs.autojs.R; import org.autojs.autojs.autojs.AutoJs; import org.autojs.autojs.external.ScriptIntents; +import org.autojs.autojs.external.fileprovider.AppFileProvider; import org.autojs.autojs.external.shortcut.Shortcut; import org.autojs.autojs.external.shortcut.ShortcutActivity; import org.autojs.autojs.ui.edit.EditActivity; @@ -71,8 +73,7 @@ public class Scripts { public static void openByOtherApps(String path) { - Uri uri = Uri.parse("file://" + path); - GlobalAppContext.get().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + IntentUtil.viewFile(GlobalAppContext.get(), path, "text/plain", AppFileProvider.AUTHORITY); } public static void openByOtherApps(File file) { @@ -111,8 +112,8 @@ public class Scripts { public static ScriptExecution run(ScriptSource source) { try { return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() - .executePath(Pref.getScriptDirPath()) - .requirePath(Pref.getScriptDirPath())); + .executePath(Pref.getScriptDirPath()) + .requirePath(Pref.getScriptDirPath())); } catch (Exception e) { e.printStackTrace(); Toast.makeText(GlobalAppContext.get(), e.getMessage(), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java index a8fd7241..559bf5aa 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java @@ -5,10 +5,8 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.RecyclerView; import com.stardust.app.GlobalAppContext; -import com.stardust.util.BackPressedHandler; import com.stardust.util.IntentUtil; import org.androidannotations.annotations.AfterViews; @@ -16,6 +14,7 @@ import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ViewById; import org.autojs.autojs.Pref; import org.autojs.autojs.R; +import org.autojs.autojs.external.fileprovider.AppFileProvider; import org.autojs.autojs.model.explorer.ExplorerDirPage; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.Scripts; @@ -28,7 +27,6 @@ import org.autojs.autojs.ui.main.ViewPagerFragment; import org.autojs.autojs.ui.project.ProjectConfigActivity; import org.autojs.autojs.ui.project.ProjectConfigActivity_; import org.autojs.autojs.ui.viewmodel.ExplorerItemList; -import org.autojs.autojs.ui.widget.ExpandableRecyclerView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -66,7 +64,7 @@ public class MyScriptListFragment extends ViewPagerFragment implements FloatingA if (item.isEditable()) { Scripts.edit(item.toScriptFile()); } else { - IntentUtil.viewFile(GlobalAppContext.get(), item.getPath()); + IntentUtil.viewFile(GlobalAppContext.get(), item.getPath(), AppFileProvider.AUTHORITY); } }); } diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml index ffa74ab5..3e5ddda3 100644 --- a/app/src/main/res/xml/provider_paths.xml +++ b/app/src/main/res/xml/provider_paths.xml @@ -1,4 +1,6 @@ + + \ No newline at end of file diff --git a/autojs/src/main/AndroidManifest.xml b/autojs/src/main/AndroidManifest.xml index 39c0a23a..bf47a035 100644 --- a/autojs/src/main/AndroidManifest.xml +++ b/autojs/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + finish()) - .show(); + .title("OpenCV error") + .content("OpenCV was not initialised correctly. Application will be shut down") + .cancelable(false) + .positiveText("OK") + .onPositive((dialog, which) -> finish()) + .show(); break; case 2: Log.e(LOG_TAG, "Package installation failed!"); @@ -117,6 +118,8 @@ public class OpenCVHelper { .negativeText("Exit") .onNegative(((dialog, which) -> callback.cancel())) .show(); + default: + finish(); } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java index d7e0b18e..b26a2279 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java @@ -7,9 +7,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.support.annotation.Nullable; -import android.text.TextUtils; import android.util.Log; -import android.webkit.MimeTypeMap; import com.stardust.autojs.annotation.ScriptInterface; import com.stardust.util.IntentUtil; @@ -18,8 +16,6 @@ import com.stardust.util.MimeTypes; import java.lang.ref.WeakReference; import java.util.List; -import static com.stardust.pio.PFiles.getExtension; - /** * Created by Stardust on 2017/4/2. */ @@ -28,9 +24,16 @@ public class AppUtils { private Context mContext; private volatile WeakReference mCurrentActivity = new WeakReference<>(null); + private final String mFileProviderAuthority; public AppUtils(Context context) { mContext = context; + mFileProviderAuthority = null; + } + + public AppUtils(Context context, String fileProviderAuthority) { + mContext = context; + mFileProviderAuthority = fileProviderAuthority; } @ScriptInterface @@ -99,22 +102,14 @@ public class AppUtils { public void viewFile(String path) { if (path == null) throw new NullPointerException("path == null"); - path = "file://" + path; - String mimeType = MimeTypes.fromFileOr(path, "*/*"); - mContext.startActivity(new Intent(Intent.ACTION_VIEW) - .setDataAndType(Uri.parse(path), mimeType) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + IntentUtil.viewFile(mContext, path, mFileProviderAuthority); } @ScriptInterface public void editFile(String path) { if (path == null) throw new NullPointerException("path == null"); - path = "file://" + path; - String mimeType = MimeTypes.fromFileOr(path, "*/*"); - mContext.startActivity(new Intent(Intent.ACTION_EDIT) - .setDataAndType(Uri.parse(path), mimeType) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + IntentUtil.editFile(mContext, path, mFileProviderAuthority); } @ScriptInterface diff --git a/build.gradle b/build.gradle index ae5f3c13..254d63d6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import groovy.json.JsonSlurper + // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { @@ -27,12 +29,5 @@ task clean(type: Delete) { } ext { - versions = [ - appVersionCode: 423, - appVersionName: '4.0.3 Alpha4', - target : 28, - mini : 17, - compile : 28, - buildTool : '28.0.3' - ] + versions = new JsonSlurper().parse(file('./project-versions.json')) } diff --git a/common/release/output.json b/common/release/output.json index 053960b0..93b92607 100644 --- a/common/release/output.json +++ b/common/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":423},"path":"commonRelease-4.0.3 Alpha4.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":424,"versionName":"4.0.3 Alpha5","enabled":true,"outputFile":"commonRelease-4.0.3 Alpha5.apk","fullName":"commonRelease","baseName":"common-release"},"path":"commonRelease-4.0.3 Alpha5.apk","properties":{}}] \ No newline at end of file diff --git a/common/src/main/java/com/stardust/util/IntentUtil.java b/common/src/main/java/com/stardust/util/IntentUtil.java index 174b9689..52eb7f92 100644 --- a/common/src/main/java/com/stardust/util/IntentUtil.java +++ b/common/src/main/java/com/stardust/util/IntentUtil.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; +import android.support.v4.content.FileProvider; import java.io.File; @@ -93,11 +94,37 @@ public class IntentUtil { context.startActivity(intent); } - public static void viewFile(Context context, String path) { - path = "file://" + path; + public static void viewFile(Context context, String path, String fileProviderAuthority) { String mimeType = MimeTypes.fromFileOr(path, "*/*"); + viewFile(context, path, mimeType, fileProviderAuthority); + } + + public static void viewFile(Context context, String path, String mimeType, String fileProviderAuthority) { + Uri uri; + if (fileProviderAuthority == null) { + uri = Uri.parse("file://" + path); + } else { + uri = FileProvider.getUriForFile(context, fileProviderAuthority, new File(path)); + } context.startActivity(new Intent(Intent.ACTION_VIEW) - .setDataAndType(Uri.parse(path), mimeType) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + .setDataAndType(uri, mimeType) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); + } + + public static void editFile(Context context, String path, String fileProviderAuthority) { + String mimeType = MimeTypes.fromFileOr(path, "*/*"); + Uri uri; + if (fileProviderAuthority == null) { + uri = Uri.parse("file://" + path); + } else { + uri = FileProvider.getUriForFile(context, fileProviderAuthority, new File(path)); + } + context.startActivity(new Intent(Intent.ACTION_EDIT) + .setDataAndType(uri, mimeType) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2230d7d0..999ec928 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/inrt/build.gradle b/inrt/build.gradle index 98285bbc..5b3f1ba3 100644 --- a/inrt/build.gradle +++ b/inrt/build.gradle @@ -36,6 +36,39 @@ android { } } + +task buildApkPlugin { + doLast { + def pluginProjectDirPath = '..\\..\\AutoJsApkBuilderPlugin' + def pluginProjectDir = file(pluginProjectDirPath) + if(!pluginProjectDir.exists() || !pluginProjectDir.isDirectory()){ + println 'pluginProjectDir not exists' + return + } + copy { + from file('build\\outputs\\apk\\release\\') + into new File(pluginProjectDir, 'app\\src\\main\\assets') + include "inrt-release-unsigned.apk" + rename "inrt-release-unsigned.apk", 'template.apk' + } + exec { + workingDir pluginProjectDir + commandLine 'gradlew.bat', 'assembleRelease' + } + copy { + from new File(pluginProjectDir, 'app\\build\\outputs\\apk\\release') + into file('..\\common\\release') + include '*-release.apk' + } + } +} + +tasks.whenTaskAdded { task -> + if (task.name == 'assembleRelease') { + task.finalizedBy 'buildApkPlugin' + } +} + repositories { flatDir { dirs 'libs' diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java index 3e9ed621..63080711 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java @@ -75,9 +75,7 @@ public class SplashActivity extends AppCompatActivity { runScript(); } } else { - int[] grantResults = new int[permissions.length]; - Arrays.fill(grantResults, PERMISSION_GRANTED); - onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults); + runScript(); } } diff --git a/project-versions.json b/project-versions.json new file mode 100644 index 00000000..22a2a0b9 --- /dev/null +++ b/project-versions.json @@ -0,0 +1,8 @@ +{ + "appVersionCode": 424, + "appVersionName": "4.0.3 Alpha5", + "target": 28, + "mini": 17, + "compile": 28, + "buildTool": "28.0.3" +} \ No newline at end of file