From b0631cefad60728f6de19091d3ed0cf9c060552c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Wed, 25 Apr 2018 16:20:57 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8D=E5=85=81=E8=AE=B8=E5=A4=96=E9=83=A8=E5=85=B3?= =?UTF-8?q?=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- acp/build.gradle | 2 +- .../main/java/com/mylhyl/acp/AcpManager.java | 15 +++++++---- .../main/java/com/mylhyl/acp/AcpOptions.java | 26 ++++++++++++++++++- sample/build.gradle | 2 +- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index adec374..2f95c35 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ #使用Gradle构建时添加一下依赖即可: ```javascript -compile 'com.mylhyl:acp:1.1.7' +compile 'com.mylhyl:acp:1.2.0' ``` # 使用说明 diff --git a/acp/build.gradle b/acp/build.gradle index 9b2f45d..5dfb6d2 100644 --- a/acp/build.gradle +++ b/acp/build.gradle @@ -26,7 +26,7 @@ def siteUrl = 'https://github.com/mylhyl/AndroidAcp' def gitUrl = 'https://github.com/mylhyl/AndroidAcp.git' group = "com.mylhyl" -version = "1.1.7" +version = "1.2.0" install { repositories.mavenInstaller { diff --git a/acp/src/main/java/com/mylhyl/acp/AcpManager.java b/acp/src/main/java/com/mylhyl/acp/AcpManager.java index a9775b2..2f9c945 100644 --- a/acp/src/main/java/com/mylhyl/acp/AcpManager.java +++ b/acp/src/main/java/com/mylhyl/acp/AcpManager.java @@ -137,14 +137,17 @@ synchronized void checkRequestPermissionRationale(Activity activity) { * @param permissions */ private synchronized void showRationalDialog(final String[] permissions) { - new AlertDialog.Builder(mActivity) + AlertDialog alertDialog = new AlertDialog.Builder(mActivity) .setMessage(mOptions.getRationalMessage()) .setPositiveButton(mOptions.getRationalBtnText(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(permissions); } - }).show(); + }).create(); + alertDialog.setCancelable(mOptions.isDialogCancelable()); + alertDialog.setCanceledOnTouchOutside(mOptions.isDialogCanceledOnTouchOutside()); + alertDialog.show(); } /** @@ -190,9 +193,8 @@ synchronized void onRequestPermissionsResult(int requestCode, String[] permissio * @param permissions */ private synchronized void showDeniedDialog(final List permissions) { - new AlertDialog.Builder(mActivity) + AlertDialog alertDialog = new AlertDialog.Builder(mActivity) .setMessage(mOptions.getDeniedMessage()) - .setCancelable(false) .setNegativeButton(mOptions.getDeniedCloseBtn(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { @@ -206,7 +208,10 @@ public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialog, int which) { startSetting(); } - }).show(); + }).create(); + alertDialog.setCancelable(mOptions.isDialogCancelable()); + alertDialog.setCanceledOnTouchOutside(mOptions.isDialogCanceledOnTouchOutside()); + alertDialog.show(); } /** diff --git a/acp/src/main/java/com/mylhyl/acp/AcpOptions.java b/acp/src/main/java/com/mylhyl/acp/AcpOptions.java index 4468991..cc82b6d 100644 --- a/acp/src/main/java/com/mylhyl/acp/AcpOptions.java +++ b/acp/src/main/java/com/mylhyl/acp/AcpOptions.java @@ -10,6 +10,8 @@ public final class AcpOptions { private String mDeniedSettingBtn; private String mRationalBtn; private String[] mPermissions; + private boolean mDialogCancelable; + private boolean mDialogCanceledOnTouchOutside; private AcpOptions(Builder builder) { mRationalMessage = builder.mRationalMessage; @@ -17,7 +19,9 @@ private AcpOptions(Builder builder) { mDeniedCloseBtn = builder.mDeniedCloseBtn; mDeniedSettingBtn = builder.mDeniedSettingBtn; mRationalBtn = builder.mRationalBtn; - this.mPermissions = builder.mPermissions; + mPermissions = builder.mPermissions; + mDialogCancelable = builder.dialogCancelable; + mDialogCanceledOnTouchOutside = builder.dialogCanceledOnTouchOutside; } public String getRationalMessage() { @@ -44,6 +48,14 @@ public String[] getPermissions() { return mPermissions; } + public boolean isDialogCancelable() { + return mDialogCancelable; + } + + public boolean isDialogCanceledOnTouchOutside() { + return mDialogCanceledOnTouchOutside; + } + public static class Builder { private static final String DEF_RATIONAL_MESSAGE = "此功能需要您授权,否则将不能正常使用"; private static final String DEF_DENIED_MESSAGE = "您拒绝权限申请,此功能将不能正常使用,您可以去设置页面重新授权"; @@ -56,6 +68,8 @@ public static class Builder { private String mDeniedSettingBtn = DEF_DENIED_SETTINGS_BTN_TEXT; private String mRationalBtn = DEF_RATIONAL_BTN_TEXT; private String[] mPermissions; + private boolean dialogCancelable = false; + private boolean dialogCanceledOnTouchOutside = false; /** * 申请权限理由框提示语 @@ -123,6 +137,16 @@ public Builder setPermissions(String... mPermissions) { return this; } + public Builder setDialogCancelable(boolean dialogCancelable) { + this.dialogCancelable = dialogCancelable; + return this; + } + + public Builder setDialogCanceledOnTouchOutside(boolean dialogCanceledOnTouchOutside) { + this.dialogCanceledOnTouchOutside = dialogCanceledOnTouchOutside; + return this; + } + public AcpOptions build() { if (this.mPermissions == null || this.mPermissions.length == 0) { throw new IllegalArgumentException("mPermissions no found..."); diff --git a/sample/build.gradle b/sample/build.gradle index 3889f38..014599d 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -9,7 +9,7 @@ android { minSdkVersion 15 targetSdkVersion 23 versionCode 1 - versionName "1.0" + versionName "20180425" } buildTypes { release { From 0af65bd58cbe952e4e19b3b28fc07116b9fde1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Wed, 25 Apr 2018 16:36:36 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E6=9B=B4=E6=8D=A2bintray=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- acp/build.gradle | 94 +++---------------- build.gradle | 15 ++- gradle/wrapper/gradle-wrapper.properties | 4 +- sample/build.gradle | 9 +- .../main/java/com/mylhyl/acp/sample/App.java | 7 +- 5 files changed, 41 insertions(+), 88 deletions(-) diff --git a/acp/build.gradle b/acp/build.gradle index 5dfb6d2..a4e0c4a 100644 --- a/acp/build.gradle +++ b/acp/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' +apply plugin: 'maven' +apply plugin: 'com.novoda.bintray-release' android { compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion "25.0.0" defaultConfig { minSdkVersion 14 targetSdkVersion 23 versionCode 1 - versionName version + versionName '1.2.0' } buildTypes { release { @@ -19,85 +19,19 @@ android { } lintOptions { abortOnError false + checkReleaseBuilds false } } -def siteUrl = 'https://github.com/mylhyl/AndroidAcp' -def gitUrl = 'https://github.com/mylhyl/AndroidAcp.git' - -group = "com.mylhyl" -version = "1.2.0" - -install { - repositories.mavenInstaller { - pom { - project { - packaging 'aar' - artifactId 'acp' - name 'Simplify Android 6.0 complex permissions operation' - url siteUrl - - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - } - } - - developers { - developer { - id 'mylhyl' - name 'mylhylAndroid' - email 'hupei132@qq.com' - } - } - - scm { - connection gitUrl - developerConnection gitUrl - url siteUrl - } - } - } - } -} - -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - options.encoding = "UTF-8" - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives javadocJar - archives sourcesJar -} - -Properties properties = new Properties() -properties.load(project.rootProject.file('local.properties').newDataInputStream()) -bintray { - user = properties.getProperty("BINTRAY_USER") - key = properties.getProperty("BINTRAY_KEY") - configurations = ['archives'] - pkg { - repo = "maven" - name = "acp" - websiteUrl = siteUrl - vcsUrl = gitUrl - licenses = ["Apache-2.0"] - publish = true //是否发布 - } -} dependencies { compile 'com.android.support:appcompat-v7:23.4.0' } + +publish { + userOrg = 'mylhyl' + groupId = 'com.mylhyl' + artifactId = 'acp' + version = '1.2.0' + description = 'Simplify Android 6.0 complex permissions operation' + website = "https://github.com/mylhyl/AndroidAcp" +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8e38983..9b7f9bd 100644 --- a/build.gradle +++ b/build.gradle @@ -3,14 +3,23 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.2' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' + classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.novoda:bintray-release:0.3.4' } } allprojects { repositories { jcenter() + maven { url "https://jitpack.io" } + } + + tasks.withType(Javadoc) { + options { + encoding "UTF-8" + charSet 'UTF-8' + links "http://docs.oracle.com/javase/7/docs/api" + failOnError false + } } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 122a0dc..61cbfb5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Wed Apr 25 16:27:49 CST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index 014599d..521f974 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.2" + buildToolsVersion "25.0.0" defaultConfig { applicationId "com.mylhyl.acp.sample" @@ -17,6 +17,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + abortOnError false + } } dependencies { @@ -24,5 +27,7 @@ dependencies { compile project(':acp') compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' } diff --git a/sample/src/main/java/com/mylhyl/acp/sample/App.java b/sample/src/main/java/com/mylhyl/acp/sample/App.java index 5e952d5..7314db5 100644 --- a/sample/src/main/java/com/mylhyl/acp/sample/App.java +++ b/sample/src/main/java/com/mylhyl/acp/sample/App.java @@ -7,10 +7,15 @@ /** * Created by hupei on 2016/9/5. */ -public class App extends Application{ +public class App extends Application { @Override public void onCreate() { super.onCreate(); + if (LeakCanary.isInAnalyzerProcess(this)) { + // This process is dedicated to LeakCanary for heap analysis. + // You should not init your app in this process. + return; + } LeakCanary.install(this); } } From e5fd993877ccedfc68e5298629a4e9bd28eb8757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Fri, 25 Jan 2019 09:54:25 +0800 Subject: [PATCH 03/12] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 2f95c35..e40368d 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,6 @@ compile 'com.mylhyl:acp:1.2.0' ### [下载APK体验](/preview/sample-debug.apk) -## QQ交流群:435173211 - #### 版本日志 > 1.1.7 修复内存泄露 @@ -58,4 +56,4 @@ compile 'com.mylhyl:acp:1.2.0' > 1.0.2 修复申请的权限不在`AndroidManifest.xml`配置文件时,中仍然显示`RationalMessage`对话框的问题 -> 1.0.1 修改 minSdkVersion 14 \ No newline at end of file +> 1.0.1 修改 minSdkVersion 14 From b46a9630456e3ba859b987a48fb3c655d03a0a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Tue, 21 May 2019 14:21:42 +0800 Subject: [PATCH 04/12] gradle 4.4 --- acp/build.gradle | 11 ++++---- acp/src/main/java/com/mylhyl/acp/Acp.java | 32 +++++++++++++---------- build.gradle | 6 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- sample/build.gradle | 16 +++++------- 5 files changed, 35 insertions(+), 32 deletions(-) diff --git a/acp/build.gradle b/acp/build.gradle index a4e0c4a..027b38a 100644 --- a/acp/build.gradle +++ b/acp/build.gradle @@ -3,11 +3,10 @@ apply plugin: 'maven' apply plugin: 'com.novoda.bintray-release' android { - compileSdkVersion 23 - buildToolsVersion "25.0.0" + compileSdkVersion 28 defaultConfig { minSdkVersion 14 - targetSdkVersion 23 + targetSdkVersion 28 versionCode 1 versionName '1.2.0' } @@ -24,14 +23,14 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:23.4.0' + compileOnly 'com.android.support:appcompat-v7:28.0.0' } publish { userOrg = 'mylhyl' groupId = 'com.mylhyl' artifactId = 'acp' - version = '1.2.0' - description = 'Simplify Android 6.0 complex permissions operation' + publishVersion = '1.2.0' + desc = 'Simplify Android 6.0 complex permissions operation' website = "https://github.com/mylhyl/AndroidAcp" } \ No newline at end of file diff --git a/acp/src/main/java/com/mylhyl/acp/Acp.java b/acp/src/main/java/com/mylhyl/acp/Acp.java index ce33a4c..6c2591d 100644 --- a/acp/src/main/java/com/mylhyl/acp/Acp.java +++ b/acp/src/main/java/com/mylhyl/acp/Acp.java @@ -5,23 +5,14 @@ /** * Created by hupei on 2016/4/26. */ -public class Acp { - - private static Acp mInstance; +public final class Acp { + private volatile boolean mInitialized; private AcpManager mAcpManager; public static Acp getInstance(Context context) { - if (mInstance == null) - synchronized (Acp.class) { - if (mInstance == null) { - mInstance = new Acp(context); - } - } - return mInstance; - } - - private Acp(Context context) { - mAcpManager = new AcpManager(context.getApplicationContext()); + Acp instance = HolderClass.instance; + instance.init(context); + return instance; } /** @@ -31,6 +22,7 @@ private Acp(Context context) { * @param acpListener */ public void request(AcpOptions options, AcpListener acpListener) { + //Preconditions if (options == null) new NullPointerException("AcpOptions is null..."); if (acpListener == null) new NullPointerException("AcpListener is null..."); mAcpManager.request(options, acpListener); @@ -39,4 +31,16 @@ public void request(AcpOptions options, AcpListener acpListener) { AcpManager getAcpManager() { return mAcpManager; } + + private void init(Context context) { + if (mInitialized) { + return; + } + mAcpManager = new AcpManager(context.getApplicationContext()); + mInitialized = true; + } + + private static class HolderClass { + private static final Acp instance = new Acp(); + } } diff --git a/build.gradle b/build.gradle index 9b7f9bd..e0597e5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' - classpath 'com.novoda:bintray-release:0.3.4' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.novoda:bintray-release:0.8.1' } } @@ -12,6 +13,7 @@ allprojects { repositories { jcenter() maven { url "https://jitpack.io" } + google() } tasks.withType(Javadoc) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 61cbfb5..abdc840 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-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index 521f974..ce402a0 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -2,8 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "25.0.0" - defaultConfig { applicationId "com.mylhyl.acp.sample" minSdkVersion 15 @@ -23,11 +21,11 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(':acp') - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:support-v4:23.1.1' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' - testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':acp') + implementation 'com.android.support:appcompat-v7:23.1.1' + implementation 'com.android.support:support-v4:23.1.1' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + androidTestImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' } From ea657f71a0873d639987c8777546c43c5cabfe58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Wed, 22 May 2019 08:40:04 +0800 Subject: [PATCH 05/12] vivo --- .../java/com/mylhyl/acp/ApplicationTest.java | 13 -- acp/src/main/java/com/mylhyl/acp/MiuiOs.java | 108 --------- {acp => app}/.gitignore | 0 {sample => app}/build.gradle | 2 +- {acp => app}/proguard-rules.pro | 0 .../mylhyl/acp/sample/ApplicationTest.java | 0 {sample => app}/src/main/AndroidManifest.xml | 0 .../main/java/com/mylhyl/acp/sample/App.java | 0 .../com/mylhyl/acp/sample/BlankActivity.java | 0 .../com/mylhyl/acp/sample/MainActivity.java | 0 .../src/main/res/layout/activity_main.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../src/main/res/values-w820dp/dimens.xml | 0 .../src/main/res/values/colors.xml | 0 .../src/main/res/values/dimens.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles.xml | 0 {acp => library}/build.gradle | 0 {acp => library}/src/main/AndroidManifest.xml | 1 - .../src/main/java/com/mylhyl/acp/Acp.java | 1 - .../main/java/com/mylhyl/acp/AcpActivity.java | 0 .../main/java/com/mylhyl/acp/AcpListener.java | 0 .../main/java/com/mylhyl/acp/AcpManager.java | 209 ++++++++---------- .../main/java/com/mylhyl/acp/AcpOptions.java | 0 .../main/java/com/mylhyl/acp/AcpService.java | 11 +- .../main/java/com/mylhyl/acp/os/HuaWei.java | 29 +++ .../main/java/com/mylhyl/acp/os/MeiZu.java | 39 ++++ .../main/java/com/mylhyl/acp/os/Native.java | 26 +++ .../src/main/java/com/mylhyl/acp/os/Oppo.java | 30 +++ .../main/java/com/mylhyl/acp/os/OsHelper.java | 82 +++++++ .../java/com/mylhyl/acp/os/SettingPage.java | 16 ++ .../src/main/java/com/mylhyl/acp/os/Vivo.java | 33 +++ .../main/java/com/mylhyl/acp/os/XiaoMi.java | 68 ++++++ .../src/main/res/values/style.xml | 0 settings.gradle | 2 +- 39 files changed, 425 insertions(+), 245 deletions(-) delete mode 100644 acp/src/androidTest/java/com/mylhyl/acp/ApplicationTest.java delete mode 100644 acp/src/main/java/com/mylhyl/acp/MiuiOs.java rename {acp => app}/.gitignore (100%) rename {sample => app}/build.gradle (95%) rename {acp => app}/proguard-rules.pro (100%) rename {sample => app}/src/androidTest/java/com/mylhyl/acp/sample/ApplicationTest.java (100%) rename {sample => app}/src/main/AndroidManifest.xml (100%) rename {sample => app}/src/main/java/com/mylhyl/acp/sample/App.java (100%) rename {sample => app}/src/main/java/com/mylhyl/acp/sample/BlankActivity.java (100%) rename {sample => app}/src/main/java/com/mylhyl/acp/sample/MainActivity.java (100%) rename {sample => app}/src/main/res/layout/activity_main.xml (100%) rename {sample => app}/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {sample => app}/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {sample => app}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {sample => app}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {sample => app}/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {sample => app}/src/main/res/values-w820dp/dimens.xml (100%) rename {sample => app}/src/main/res/values/colors.xml (100%) rename {sample => app}/src/main/res/values/dimens.xml (100%) rename {sample => app}/src/main/res/values/strings.xml (100%) rename {sample => app}/src/main/res/values/styles.xml (100%) rename {acp => library}/build.gradle (100%) rename {acp => library}/src/main/AndroidManifest.xml (87%) rename {acp => library}/src/main/java/com/mylhyl/acp/Acp.java (97%) rename {acp => library}/src/main/java/com/mylhyl/acp/AcpActivity.java (100%) rename {acp => library}/src/main/java/com/mylhyl/acp/AcpListener.java (100%) rename {acp => library}/src/main/java/com/mylhyl/acp/AcpManager.java (79%) rename {acp => library}/src/main/java/com/mylhyl/acp/AcpOptions.java (100%) rename {acp => library}/src/main/java/com/mylhyl/acp/AcpService.java (85%) create mode 100644 library/src/main/java/com/mylhyl/acp/os/HuaWei.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/MeiZu.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/Native.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/Oppo.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/OsHelper.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/SettingPage.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/Vivo.java create mode 100644 library/src/main/java/com/mylhyl/acp/os/XiaoMi.java rename {acp => library}/src/main/res/values/style.xml (100%) diff --git a/acp/src/androidTest/java/com/mylhyl/acp/ApplicationTest.java b/acp/src/androidTest/java/com/mylhyl/acp/ApplicationTest.java deleted file mode 100644 index 273e514..0000000 --- a/acp/src/androidTest/java/com/mylhyl/acp/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.mylhyl.acp; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/acp/src/main/java/com/mylhyl/acp/MiuiOs.java b/acp/src/main/java/com/mylhyl/acp/MiuiOs.java deleted file mode 100644 index 263b3c1..0000000 --- a/acp/src/main/java/com/mylhyl/acp/MiuiOs.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.mylhyl.acp; - -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.text.TextUtils; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * 参考 http://blog.csdn.net/tgbus18990140382/article/details/47058043 - * Created by hupei on 2016/7/22. - */ -public class MiuiOs { - public static final String UNKNOWN = "UNKNOWN"; - - /** - * 获取应用权限设置 Intent
- * http://blog.csdn.net/dawanganban/article/details/41749911 - * - * @param context - */ - public static Intent getSettingIntent(Context context) { - // 之兼容miui v5/v6/v7 的应用权限设置页面 - if (getSystemVersionCode() >= 6) { - Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR"); - intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity"); - intent.putExtra("extra_pkgname", context.getPackageName()); - return intent; - } - return null; - } - - /** - * 获取 V5/V6 后面的数字 - * - * @return - */ - public static int getSystemVersionCode() { - String systemProperty = getSystemProperty(); - if (!TextUtils.isEmpty(systemProperty) && !systemProperty.equals(UNKNOWN) - && systemProperty.length() == 2 && systemProperty.toUpperCase().startsWith("V")) { - Integer code = 0; - try { - code = Integer.valueOf(systemProperty.substring(1)); - } catch (NumberFormatException e) { - e.printStackTrace(); - } - return code; - } - return 0; - } - - /** - * 判断V5/V6 - * - * @return V5 、V6 、V7 字符 - */ - public static String getSystemProperty() { - String line = UNKNOWN; - BufferedReader reader = null; - try { - Process p = Runtime.getRuntime().exec("getprop ro.miui.ui.version.name"); - reader = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); - line = reader.readLine(); - return line; - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (reader != null) - try { - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return line; - } - - /** - * 判断 activity 是否存在 - * - * @param context - * @param intent - * @return - */ - public static boolean isIntentAvailable(Context context, Intent intent) { - if (intent == null) return false; - return context.getPackageManager().queryIntentActivities(intent, 0).size() > 0; - } - - /** - * 检查手机是否是miui - * - * @return - * @ref http://dev.xiaomi.com/doc/p=254/index.html - */ - public static boolean isMIUI() { - String device = Build.MANUFACTURER; - if (device.equals("Xiaomi")) { - return true; - } else { - return false; - } - } -} diff --git a/acp/.gitignore b/app/.gitignore similarity index 100% rename from acp/.gitignore rename to app/.gitignore diff --git a/sample/build.gradle b/app/build.gradle similarity index 95% rename from sample/build.gradle rename to app/build.gradle index ce402a0..aa44955 100644 --- a/sample/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':acp') + implementation project(':library') implementation 'com.android.support:appcompat-v7:23.1.1' implementation 'com.android.support:support-v4:23.1.1' debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' diff --git a/acp/proguard-rules.pro b/app/proguard-rules.pro similarity index 100% rename from acp/proguard-rules.pro rename to app/proguard-rules.pro diff --git a/sample/src/androidTest/java/com/mylhyl/acp/sample/ApplicationTest.java b/app/src/androidTest/java/com/mylhyl/acp/sample/ApplicationTest.java similarity index 100% rename from sample/src/androidTest/java/com/mylhyl/acp/sample/ApplicationTest.java rename to app/src/androidTest/java/com/mylhyl/acp/sample/ApplicationTest.java diff --git a/sample/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml similarity index 100% rename from sample/src/main/AndroidManifest.xml rename to app/src/main/AndroidManifest.xml diff --git a/sample/src/main/java/com/mylhyl/acp/sample/App.java b/app/src/main/java/com/mylhyl/acp/sample/App.java similarity index 100% rename from sample/src/main/java/com/mylhyl/acp/sample/App.java rename to app/src/main/java/com/mylhyl/acp/sample/App.java diff --git a/sample/src/main/java/com/mylhyl/acp/sample/BlankActivity.java b/app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java similarity index 100% rename from sample/src/main/java/com/mylhyl/acp/sample/BlankActivity.java rename to app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java diff --git a/sample/src/main/java/com/mylhyl/acp/sample/MainActivity.java b/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java similarity index 100% rename from sample/src/main/java/com/mylhyl/acp/sample/MainActivity.java rename to app/src/main/java/com/mylhyl/acp/sample/MainActivity.java diff --git a/sample/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml similarity index 100% rename from sample/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/activity_main.xml diff --git a/sample/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from sample/src/main/res/mipmap-hdpi/ic_launcher.png rename to app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/sample/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from sample/src/main/res/mipmap-mdpi/ic_launcher.png rename to app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/sample/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from sample/src/main/res/mipmap-xhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/sample/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from sample/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/sample/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml similarity index 100% rename from sample/src/main/res/values-w820dp/dimens.xml rename to app/src/main/res/values-w820dp/dimens.xml diff --git a/sample/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml similarity index 100% rename from sample/src/main/res/values/colors.xml rename to app/src/main/res/values/colors.xml diff --git a/sample/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml similarity index 100% rename from sample/src/main/res/values/dimens.xml rename to app/src/main/res/values/dimens.xml diff --git a/sample/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml similarity index 100% rename from sample/src/main/res/values/strings.xml rename to app/src/main/res/values/strings.xml diff --git a/sample/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml similarity index 100% rename from sample/src/main/res/values/styles.xml rename to app/src/main/res/values/styles.xml diff --git a/acp/build.gradle b/library/build.gradle similarity index 100% rename from acp/build.gradle rename to library/build.gradle diff --git a/acp/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml similarity index 87% rename from acp/src/main/AndroidManifest.xml rename to library/src/main/AndroidManifest.xml index 297b5c9..08a54b1 100644 --- a/acp/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -5,7 +5,6 @@ diff --git a/acp/src/main/java/com/mylhyl/acp/Acp.java b/library/src/main/java/com/mylhyl/acp/Acp.java similarity index 97% rename from acp/src/main/java/com/mylhyl/acp/Acp.java rename to library/src/main/java/com/mylhyl/acp/Acp.java index 6c2591d..406ea4e 100644 --- a/acp/src/main/java/com/mylhyl/acp/Acp.java +++ b/library/src/main/java/com/mylhyl/acp/Acp.java @@ -22,7 +22,6 @@ public static Acp getInstance(Context context) { * @param acpListener */ public void request(AcpOptions options, AcpListener acpListener) { - //Preconditions if (options == null) new NullPointerException("AcpOptions is null..."); if (acpListener == null) new NullPointerException("AcpListener is null..."); mAcpManager.request(options, acpListener); diff --git a/acp/src/main/java/com/mylhyl/acp/AcpActivity.java b/library/src/main/java/com/mylhyl/acp/AcpActivity.java similarity index 100% rename from acp/src/main/java/com/mylhyl/acp/AcpActivity.java rename to library/src/main/java/com/mylhyl/acp/AcpActivity.java diff --git a/acp/src/main/java/com/mylhyl/acp/AcpListener.java b/library/src/main/java/com/mylhyl/acp/AcpListener.java similarity index 100% rename from acp/src/main/java/com/mylhyl/acp/AcpListener.java rename to library/src/main/java/com/mylhyl/acp/AcpListener.java diff --git a/acp/src/main/java/com/mylhyl/acp/AcpManager.java b/library/src/main/java/com/mylhyl/acp/AcpManager.java similarity index 79% rename from acp/src/main/java/com/mylhyl/acp/AcpManager.java rename to library/src/main/java/com/mylhyl/acp/AcpManager.java index 2f9c945..82af7be 100644 --- a/acp/src/main/java/com/mylhyl/acp/AcpManager.java +++ b/library/src/main/java/com/mylhyl/acp/AcpManager.java @@ -2,17 +2,16 @@ import android.app.Activity; import android.app.AlertDialog; -import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.Build; -import android.provider.Settings; import android.util.Log; +import com.mylhyl.acp.os.OsHelper; + import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -25,25 +24,97 @@ class AcpManager { private static final String TAG = "AcpManager"; private static final int REQUEST_CODE_PERMISSION = 0x38; private static final int REQUEST_CODE_SETTING = 0x39; - private Context mContext; - private Activity mActivity; - private AcpService mService; - private AcpOptions mOptions; - private AcpListener mCallback; private final List mDeniedPermissions = new LinkedList<>(); private final Set mManifestPermissions = new HashSet<>(1); + private Context appContext; + private Activity internalActivity; + private AcpOptions mOptions; + private AcpListener mCallback; AcpManager(Context context) { - mContext = context; - mService = new AcpService(); + appContext = context; getManifestPermissions(); } + /** + * 开始请求 + * + * @param options + * @param acpListener + */ + synchronized void request(AcpOptions options, AcpListener acpListener) { + mCallback = acpListener; + mOptions = options; + checkSelfPermission(); + } + + /** + * 检查权限是否存在拒绝不再提示 + * + * @param activity + */ + synchronized void checkRequestPermissionRationale(Activity activity) { + internalActivity = activity; + boolean rationale = false; + //如果有拒绝则提示申请理由提示框,否则直接向系统请求权限 + for (String permission : mDeniedPermissions) { + rationale = rationale || AcpService.shouldShowRequestPermissionRationale(internalActivity, permission); + } + Log.i(TAG, "rationale = " + rationale); + String[] permissions = mDeniedPermissions.toArray(new String[mDeniedPermissions.size()]); + if (rationale) showRationalDialog(permissions); + else requestPermissions(permissions); + } + + /** + * 响应向系统请求权限结果 + * + * @param requestCode + * @param permissions + * @param grantResults + */ + synchronized void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + switch (requestCode) { + case REQUEST_CODE_PERMISSION: + LinkedList grantedPermissions = new LinkedList<>(); + LinkedList deniedPermissions = new LinkedList<>(); + for (int i = 0; i < permissions.length; i++) { + String permission = permissions[i]; + if (grantResults[i] == PackageManager.PERMISSION_GRANTED) + grantedPermissions.add(permission); + else deniedPermissions.add(permission); + } + //全部允许才回调 onGranted 否则只要有一个拒绝都回调 onDenied + if (!grantedPermissions.isEmpty() && deniedPermissions.isEmpty()) { + if (mCallback != null) + mCallback.onGranted(); + onDestroy(); + } else if (!deniedPermissions.isEmpty()) showDeniedDialog(deniedPermissions); + break; + } + } + + /** + * 响应设置权限返回结果 + * + * @param requestCode + * @param resultCode + * @param data + */ + synchronized void onActivityResult(int requestCode, int resultCode, Intent data) { + if (mCallback == null || mOptions == null + || requestCode != REQUEST_CODE_SETTING) { + onDestroy(); + return; + } + checkSelfPermission(); + } + private synchronized void getManifestPermissions() { PackageInfo packageInfo = null; try { - packageInfo = mContext.getPackageManager().getPackageInfo( - mContext.getPackageName(), PackageManager.GET_PERMISSIONS); + packageInfo = appContext.getPackageManager().getPackageInfo( + appContext.getPackageName(), PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } @@ -57,18 +128,6 @@ private synchronized void getManifestPermissions() { } } - /** - * 开始请求 - * - * @param options - * @param acpListener - */ - synchronized void request(AcpOptions options, AcpListener acpListener) { - mCallback = acpListener; - mOptions = options; - checkSelfPermission(); - } - /** * 检查权限 */ @@ -85,7 +144,7 @@ private synchronized void checkSelfPermission() { for (String permission : permissions) { //检查申请的权限是否在 AndroidManifest.xml 中 if (mManifestPermissions.contains(permission)) { - int checkSelfPermission = mService.checkSelfPermission(mContext, permission); + int checkSelfPermission = AcpService.checkSelfPermission(appContext, permission); Log.i(TAG, "checkSelfPermission = " + checkSelfPermission); //如果是拒绝状态则装入拒绝集合中 if (checkSelfPermission == PackageManager.PERMISSION_DENIED) { @@ -108,27 +167,9 @@ private synchronized void checkSelfPermission() { * 启动处理权限过程的 Activity */ private synchronized void startAcpActivity() { - Intent intent = new Intent(mContext, AcpActivity.class); + Intent intent = new Intent(appContext, AcpActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); - } - - /** - * 检查权限是否存在拒绝不再提示 - * - * @param activity - */ - synchronized void checkRequestPermissionRationale(Activity activity) { - mActivity = activity; - boolean rationale = false; - //如果有拒绝则提示申请理由提示框,否则直接向系统请求权限 - for (String permission : mDeniedPermissions) { - rationale = rationale || mService.shouldShowRequestPermissionRationale(mActivity, permission); - } - Log.i(TAG, "rationale = " + rationale); - String[] permissions = mDeniedPermissions.toArray(new String[mDeniedPermissions.size()]); - if (rationale) showRationalDialog(permissions); - else requestPermissions(permissions); + appContext.startActivity(intent); } /** @@ -137,7 +178,7 @@ synchronized void checkRequestPermissionRationale(Activity activity) { * @param permissions */ private synchronized void showRationalDialog(final String[] permissions) { - AlertDialog alertDialog = new AlertDialog.Builder(mActivity) + AlertDialog alertDialog = new AlertDialog.Builder(internalActivity) .setMessage(mOptions.getRationalMessage()) .setPositiveButton(mOptions.getRationalBtnText(), new DialogInterface.OnClickListener() { @Override @@ -156,35 +197,7 @@ public void onClick(DialogInterface dialog, int which) { * @param permissions */ private synchronized void requestPermissions(String[] permissions) { - mService.requestPermissions(mActivity, permissions, REQUEST_CODE_PERMISSION); - } - - /** - * 响应向系统请求权限结果 - * - * @param requestCode - * @param permissions - * @param grantResults - */ - synchronized void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - switch (requestCode) { - case REQUEST_CODE_PERMISSION: - LinkedList grantedPermissions = new LinkedList<>(); - LinkedList deniedPermissions = new LinkedList<>(); - for (int i = 0; i < permissions.length; i++) { - String permission = permissions[i]; - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) - grantedPermissions.add(permission); - else deniedPermissions.add(permission); - } - //全部允许才回调 onGranted 否则只要有一个拒绝都回调 onDenied - if (!grantedPermissions.isEmpty() && deniedPermissions.isEmpty()) { - if (mCallback != null) - mCallback.onGranted(); - onDestroy(); - } else if (!deniedPermissions.isEmpty()) showDeniedDialog(deniedPermissions); - break; - } + AcpService.requestPermissions(internalActivity, permissions, REQUEST_CODE_PERMISSION); } /** @@ -193,7 +206,7 @@ synchronized void onRequestPermissionsResult(int requestCode, String[] permissio * @param permissions */ private synchronized void showDeniedDialog(final List permissions) { - AlertDialog alertDialog = new AlertDialog.Builder(mActivity) + AlertDialog alertDialog = new AlertDialog.Builder(internalActivity) .setMessage(mOptions.getDeniedMessage()) .setNegativeButton(mOptions.getDeniedCloseBtn(), new DialogInterface.OnClickListener() { @Override @@ -218,9 +231,9 @@ public void onClick(DialogInterface dialog, int which) { * 摧毁本库的 AcpActivity */ private void onDestroy() { - if (mActivity != null) { - mActivity.finish(); - mActivity = null; + if (internalActivity != null) { + internalActivity.finish(); + internalActivity = null; } mCallback = null; } @@ -229,42 +242,6 @@ private void onDestroy() { * 跳转到设置界面 */ private void startSetting() { - if (MiuiOs.isMIUI()) { - Intent intent = MiuiOs.getSettingIntent(mActivity); - if (MiuiOs.isIntentAvailable(mActivity, intent)) { - mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); - return; - } - } - try { - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.parse("package:" + mActivity.getPackageName())); - mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); - } catch (ActivityNotFoundException e) { - e.printStackTrace(); - try { - Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); - mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); - } catch (Exception e1) { - e1.printStackTrace(); - } - } - - } - - /** - * 响应设置权限返回结果 - * - * @param requestCode - * @param resultCode - * @param data - */ - synchronized void onActivityResult(int requestCode, int resultCode, Intent data) { - if (mCallback == null || mOptions == null - || requestCode != REQUEST_CODE_SETTING) { - onDestroy(); - return; - } - checkSelfPermission(); + OsHelper.startSetting(internalActivity,REQUEST_CODE_SETTING); } } diff --git a/acp/src/main/java/com/mylhyl/acp/AcpOptions.java b/library/src/main/java/com/mylhyl/acp/AcpOptions.java similarity index 100% rename from acp/src/main/java/com/mylhyl/acp/AcpOptions.java rename to library/src/main/java/com/mylhyl/acp/AcpOptions.java diff --git a/acp/src/main/java/com/mylhyl/acp/AcpService.java b/library/src/main/java/com/mylhyl/acp/AcpService.java similarity index 85% rename from acp/src/main/java/com/mylhyl/acp/AcpService.java rename to library/src/main/java/com/mylhyl/acp/AcpService.java index 3a4fce1..acfc1b2 100644 --- a/acp/src/main/java/com/mylhyl/acp/AcpService.java +++ b/library/src/main/java/com/mylhyl/acp/AcpService.java @@ -13,7 +13,10 @@ /** * Created by hupei on 2016/4/26. */ -class AcpService { +final class AcpService { + private AcpService() { + //no instance + } private static final String TAG = "AcpService"; /** @@ -23,7 +26,7 @@ class AcpService { * @param permission * @return */ - int checkSelfPermission(Context context, String permission) { + static int checkSelfPermission(Context context, String permission) { try { final PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), 0); @@ -49,7 +52,7 @@ int checkSelfPermission(Context context, String permission) { * @param permissions * @param requestCode */ - void requestPermissions(Activity activity, String[] permissions, int requestCode) { + static void requestPermissions(Activity activity, String[] permissions, int requestCode) { ActivityCompat.requestPermissions(activity, permissions, requestCode); } @@ -60,7 +63,7 @@ void requestPermissions(Activity activity, String[] permissions, int requestCode * @param permission * @return */ - boolean shouldShowRequestPermissionRationale(Activity activity, String permission) { + static boolean shouldShowRequestPermissionRationale(Activity activity, String permission) { boolean shouldShowRational = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission); Log.i(TAG, "shouldShowRational = " + shouldShowRational); return shouldShowRational; diff --git a/library/src/main/java/com/mylhyl/acp/os/HuaWei.java b/library/src/main/java/com/mylhyl/acp/os/HuaWei.java new file mode 100644 index 0000000..d82293d --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/HuaWei.java @@ -0,0 +1,29 @@ +package com.mylhyl.acp.os; + +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; + +/** + * Created by hupei on 2019/5/21 20:30. + */ +public class HuaWei implements SettingPage { + + private static final String PKG = "com.huawei.systemmanager"; + private static final String MAIN_CLS = "com.huawei.permissionmanager.ui.MainActivity"; + private Context context; + + public HuaWei(Context context) { + this.context = context; + } + + @Override + public Intent createIntent() throws ActivityNotFoundException { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(PKG, MAIN_CLS)); + intent.putExtra(EXTRA_PKG, context.getPackageName()); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } +} diff --git a/library/src/main/java/com/mylhyl/acp/os/MeiZu.java b/library/src/main/java/com/mylhyl/acp/os/MeiZu.java new file mode 100644 index 0000000..1d1e469 --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/MeiZu.java @@ -0,0 +1,39 @@ +package com.mylhyl.acp.os; + +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; + +/** + * Created by hupei on 2019/5/21 20:54. + */ +public class MeiZu implements SettingPage { + + private static final String PKG = "com.meizu.safe"; + private static final String L_MAIN_CLS = "com.meizu.safe.SecurityMainActivity"; + private static final String N_MAIN_CLS = "com.meizu.safe.permission.PermissionMainActivity"; + + private Context context; + + public MeiZu(Context context) { + this.context = context; + } + + private static String getCls() { + if (OsHelper.isAndroidL()) { + return L_MAIN_CLS; + } else { + return N_MAIN_CLS; + } + } + + @Override + public Intent createIntent() throws ActivityNotFoundException { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(PKG, getCls())); + intent.putExtra(EXTRA_PKG, context.getPackageName()); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } +} diff --git a/library/src/main/java/com/mylhyl/acp/os/Native.java b/library/src/main/java/com/mylhyl/acp/os/Native.java new file mode 100644 index 0000000..ea244ed --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/Native.java @@ -0,0 +1,26 @@ +package com.mylhyl.acp.os; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.provider.Settings; + +/** + * Created by hupei on 2019/5/21 20:14. + */ +public class Native implements SettingPage { + + private Context context; + + public Native(Context context) { + this.context = context; + } + + @Override + public Intent createIntent() { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts(EXTRA_PKG, context.getPackageName(), null); + intent.setData(uri); + return intent; + } +} diff --git a/library/src/main/java/com/mylhyl/acp/os/Oppo.java b/library/src/main/java/com/mylhyl/acp/os/Oppo.java new file mode 100644 index 0000000..ede054a --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/Oppo.java @@ -0,0 +1,30 @@ +package com.mylhyl.acp.os; + +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; + +/** + * Created by hupei on 2019/5/21 20:36. + */ +public class Oppo implements SettingPage { + + private final String PKG = "com.coloros.safecenter"; + private final String MAIN_CLS = "com.coloros.safecenter.permission.singlepage.PermissionSinglePageActivity"; + + private Context context; + + public Oppo(Context context) { + this.context = context; + } + + @Override + public Intent createIntent() throws ActivityNotFoundException { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(PKG, MAIN_CLS)); + intent.putExtra(EXTRA_PKG, context.getPackageName()); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } +} diff --git a/library/src/main/java/com/mylhyl/acp/os/OsHelper.java b/library/src/main/java/com/mylhyl/acp/os/OsHelper.java new file mode 100644 index 0000000..1cfbf8b --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/OsHelper.java @@ -0,0 +1,82 @@ +package com.mylhyl.acp.os; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Build; +import android.provider.Settings; +import android.util.Log; + +import java.util.List; + +/** + * Created by hupei on 2019/5/21 20:26. + */ +public final class OsHelper { + private static final String OS_HUAWEI = "HUAWEI"; + private static final String OS_XIAOMI = "XiaoMi"; + private static final String OS_OPPO = "Oppo"; + private static final String OS_VIVO = "vivo"; + private static final String OS_MEIZU = "meizu"; + private static final String OS_NATIVE = Build.MANUFACTURER; + + private OsHelper() { + //no instance + } + + public static Intent getIntentNative(Context context) { + return new Native(context).createIntent(); + } + + public static void startSetting(Activity activity, int requestCode) { + Intent intent = null; + try { + SettingPage settingPage = null; + if (OS_HUAWEI.equalsIgnoreCase(OS_NATIVE)) { + settingPage = new HuaWei(activity); + } else if (OS_OPPO.equalsIgnoreCase(OS_NATIVE)) { + settingPage = new Oppo(activity); + } else if (OS_VIVO.equalsIgnoreCase(OS_NATIVE)) { + settingPage = new Vivo(activity); + } else if (OS_XIAOMI.equalsIgnoreCase(OS_NATIVE)) { + settingPage = new XiaoMi(activity); + } else if (OS_MEIZU.equalsIgnoreCase(OS_NATIVE)) { + settingPage = new MeiZu(activity); + } + intent = settingPage.createIntent(); + } catch (Exception e) { + Log.e("acp OsHelper", OS_NATIVE + " " + e.getMessage()); + } + if (intent == null) { + intent = getIntentNative(activity); + } + try { + activity.startActivityForResult(intent, requestCode); + } catch (Exception e) { + e.printStackTrace(); + intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); + activity.startActivityForResult(intent, requestCode); + } + } + + static boolean isAndroidL() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M; + } + + /** + * 判断 activity 是否存在 + * + * @param context + * @param intent + * @return + */ + static boolean isIntentAvailable(Context context, Intent intent) { + if (intent == null) return false; + PackageManager packageManager = context.getPackageManager(); + List resolveInfo = packageManager.queryIntentActivities(intent + , PackageManager.MATCH_DEFAULT_ONLY); + return resolveInfo.size() > 0; + } +} diff --git a/library/src/main/java/com/mylhyl/acp/os/SettingPage.java b/library/src/main/java/com/mylhyl/acp/os/SettingPage.java new file mode 100644 index 0000000..4bb094b --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/SettingPage.java @@ -0,0 +1,16 @@ +package com.mylhyl.acp.os; + +import android.content.ActivityNotFoundException; +import android.content.Intent; + +/** + * Created by hupei on 2019/5/21 20:03. + */ +public interface SettingPage { + + String EXTRA_PKG = "package"; + String EXTRA_PKG_NAME = "packagename"; + + Intent createIntent() throws ActivityNotFoundException; + +} diff --git a/library/src/main/java/com/mylhyl/acp/os/Vivo.java b/library/src/main/java/com/mylhyl/acp/os/Vivo.java new file mode 100644 index 0000000..02f7876 --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/Vivo.java @@ -0,0 +1,33 @@ +package com.mylhyl.acp.os; + +import android.content.Context; +import android.content.Intent; + +/** + * Created by hupei on 2019/5/21 20:04. + */ +public class Vivo implements SettingPage { + + private static final String PKG = "com.iqoo.secure"; + + private Context context; + + public Vivo(Context context) { + this.context = context; + } + + @Override + public Intent createIntent() { + Intent intent = new Intent(); + intent.setClassName("com.vivo.permissionmanager" + , "com.vivo.permissionmanager.activity.SoftPermissionDetailActivity"); + if (!OsHelper.isIntentAvailable(context, intent)) { + intent.setClassName(PKG, "com.iqoo.secure.safeguard.SoftPermissionDetailActivity"); + } else if (!OsHelper.isIntentAvailable(context, intent)) { + intent.setClassName(PKG, "com.iqoo.secure.MainActivity"); + } + intent.putExtra(EXTRA_PKG_NAME, context.getPackageName()); + return intent; + } + +} diff --git a/library/src/main/java/com/mylhyl/acp/os/XiaoMi.java b/library/src/main/java/com/mylhyl/acp/os/XiaoMi.java new file mode 100644 index 0000000..23a0bb5 --- /dev/null +++ b/library/src/main/java/com/mylhyl/acp/os/XiaoMi.java @@ -0,0 +1,68 @@ +package com.mylhyl.acp.os; + +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by hupei on 2019/5/21 20:41. + */ +public class XiaoMi implements SettingPage { + + private static final String PKG = "com.miui.securitycenter"; + private static final String EXTRA_MIUI_PKG = "extra_pkgname"; + private static final String MIUI_ACTION = "miui.intent.action.APP_PERM_EDITOR"; + private static final String MIUI8_MAIN_CLS = "com.miui.securityscan.MainActivity"; + private static final String MIUI_MAIN_CLS = "com.miui.permcenter.permissions.AppPermissionsEditorActivity"; + private static final String MIUI_COMMAND_VERSION = "getprop ro.miui.ui.version.name"; + + private Context context; + + public XiaoMi(Context context) { + this.context = context; + } + + private static String getSystemProperty() { + String line = ""; + BufferedReader input = null; + try { + Process p = Runtime.getRuntime().exec(MIUI_COMMAND_VERSION); + input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); + line = input.readLine(); + } catch (IOException ex) { + ex.printStackTrace(); + return ""; + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return line; + } + + @Override + public Intent createIntent() throws ActivityNotFoundException { + Intent intent = new Intent(); + String systemProperty = getSystemProperty(); + if (systemProperty.contains("7") || systemProperty.contains("6") || systemProperty.contains("5")) { + intent = new Intent(MIUI_ACTION); + intent.setComponent(new ComponentName(PKG, MIUI_MAIN_CLS)); + intent.putExtra(EXTRA_MIUI_PKG, context.getPackageName()); + } else { + // miui 8 + intent.putExtra(EXTRA_PKG, context.getPackageName()); + intent.setComponent(new ComponentName(PKG, MIUI8_MAIN_CLS)); + } + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } +} diff --git a/acp/src/main/res/values/style.xml b/library/src/main/res/values/style.xml similarity index 100% rename from acp/src/main/res/values/style.xml rename to library/src/main/res/values/style.xml diff --git a/settings.gradle b/settings.gradle index 7d3916c..3306997 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':sample', ':acp' +include ':app', ':library' From 1c2891427a16b03586ff0513a2ab78e240c0a42a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=A4=B4?= <48025211@qq.com> Date: Wed, 22 May 2019 14:42:35 +0800 Subject: [PATCH 06/12] huawei --- app/src/main/AndroidManifest.xml | 22 ++- .../com/mylhyl/acp/sample/BlankActivity.java | 19 ++- .../com/mylhyl/acp/sample/MainActivity.java | 151 +++++++++++------- app/src/main/res/layout/activity_main.xml | 76 ++++----- {sample => library}/.gitignore | 0 {sample => library}/proguard-rules.pro | 0 .../main/java/com/mylhyl/acp/AcpListener.java | 3 +- .../main/java/com/mylhyl/acp/AcpManager.java | 34 ++-- .../main/java/com/mylhyl/acp/os/HuaWei.java | 18 ++- .../main/java/com/mylhyl/acp/os/OsHelper.java | 12 +- .../java/com/mylhyl/acp/os/SettingPage.java | 4 +- .../src/main/java/com/mylhyl/acp/os/Vivo.java | 6 +- 12 files changed, 201 insertions(+), 144 deletions(-) rename {sample => library}/.gitignore (100%) rename {sample => library}/proguard-rules.pro (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9abf3a3..3c2c2e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,31 @@ + package="com.mylhyl.acp.sample"> - - - + + + + + + + + + + + - + - + diff --git a/app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java b/app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java index da19727..61493eb 100644 --- a/app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java +++ b/app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java @@ -1,12 +1,13 @@ package com.mylhyl.acp.sample; import android.Manifest; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; +import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; import android.telephony.TelephonyManager; import android.view.Gravity; import android.view.LayoutInflater; @@ -23,6 +24,10 @@ public class BlankActivity extends AppCompatActivity { + public static void gotoAct(Activity act) { + act.startActivity(new Intent(act, BlankActivity.class)); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -31,10 +36,6 @@ protected void onCreate(Bundle savedInstanceState) { .add(android.R.id.content, BlankFragment.newInstance()).commitAllowingStateLoss(); } - public static void gotoAct(Activity act) { - act.startActivity(new Intent(act, BlankActivity.class)); - } - public static class BlankFragment extends Fragment implements View.OnClickListener { public BlankFragment() { @@ -51,7 +52,8 @@ public static BlankFragment newInstance() { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getActivity()); - textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup + .LayoutParams.MATCH_PARENT)); textView.setGravity(Gravity.CENTER); textView.setText(R.string.hello_blank_fragment); textView.append("\n\nFragment中申请权限"); @@ -71,11 +73,14 @@ public void onGranted() { @Override public void onDenied(List permissions) { - Toast.makeText(BlankFragment.this.getActivity(), permissions.toString() + "权限拒绝", Toast.LENGTH_SHORT).show(); + Toast.makeText(BlankFragment.this.getActivity(), permissions.toString() + "权限拒绝", Toast + .LENGTH_SHORT).show(); } + }); } + @SuppressLint("MissingPermission") private void getIMEI() { FragmentActivity activity = this.getActivity(); TelephonyManager tm = (TelephonyManager) this.getActivity().getSystemService(Activity.TELEPHONY_SERVICE); diff --git a/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java b/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java index 50004a1..5cebf93 100644 --- a/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java +++ b/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java @@ -1,6 +1,7 @@ package com.mylhyl.acp.sample; import android.Manifest; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -8,6 +9,7 @@ import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.telephony.TelephonyManager; +import android.util.Log; import android.view.View; import android.widget.Toast; @@ -19,36 +21,32 @@ import java.util.List; public class MainActivity extends AppCompatActivity { + private static final String TAG = "MainActivity"; // static final int READ_PHONE_STATE_REQUEST_CODE = 0x38; // static final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 0x39; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Acp.getInstance(this).request(new AcpOptions.Builder() - .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE - , Manifest.permission.READ_PHONE_STATE - , Manifest.permission.SEND_SMS) - /*以下为自定义提示语、按钮文字 - .setDeniedMessage() - .setDeniedCloseBtn() - .setDeniedSettingBtn() - .setRationalMessage() - .setRationalBtn()*/ - .build(), - new AcpListener() { - @Override - public void onGranted() { - writeSD(); - getIMEI(); - } + public static File getCacheDir(String dirName, Context context) { + File result; + if (existsSdcard()) { + File cacheDir = context.getExternalCacheDir(); + if (cacheDir == null) { + result = new File(Environment.getExternalStorageDirectory(), + "Android/data/" + context.getPackageName() + "/cache/" + dirName); + } else { + result = new File(cacheDir, dirName); + } + } else { + result = new File(context.getCacheDir(), dirName); + } + if (result.exists() || result.mkdirs()) { + return result; + } else { + return null; + } + } - @Override - public void onDenied(List permissions) { - makeText(permissions.toString() + "权限拒绝"); - } - }); + public static Boolean existsSdcard() { + return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } public void onClickFragment(View v) { @@ -60,12 +58,12 @@ public void onClickAll(View v) { .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE , Manifest.permission.READ_PHONE_STATE , Manifest.permission.SEND_SMS) - /*以下为自定义提示语、按钮文字 - .setDeniedMessage() - .setDeniedCloseBtn() - .setDeniedSettingBtn() - .setRationalMessage() - .setRationalBtn()*/ + /*以下为自定义提示语、按钮文字 + .setDeniedMessage() + .setDeniedCloseBtn() + .setDeniedSettingBtn() + .setRationalMessage() + .setRationalBtn()*/ .build(), new AcpListener() { @Override @@ -78,6 +76,7 @@ public void onGranted() { public void onDenied(List permissions) { makeText(permissions.toString() + "权限拒绝"); } + }); } @@ -87,7 +86,8 @@ public void onClickSd(View v) { // writeSD(); // } else { // ActivityCompat.requestPermissions(this, -// new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_REQUEST_CODE); +// new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, +// WRITE_EXTERNAL_STORAGE_REQUEST_CODE); // } Acp.getInstance(this).request(new AcpOptions.Builder() .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) @@ -102,6 +102,7 @@ public void onGranted() { public void onDenied(List permissions) { makeText(permissions.toString() + "权限拒绝"); } + }); } @@ -112,13 +113,15 @@ public void onClickImei(View v) { // getIMEI(); // } else { // //处理“不再提醒”,判断是否需要 向用户解释,为什么要申请该权限 -// if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) { +// if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission +// .READ_PHONE_STATE)) { // new AlertDialog.Builder(this).setMessage("需要申请imei") // .setPositiveButton("申请", new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // ActivityCompat.requestPermissions(MainActivity.this, -// new String[]{Manifest.permission.READ_PHONE_STATE}, READ_PHONE_STATE_REQUEST_CODE); +// new String[]{Manifest.permission.READ_PHONE_STATE}, +// READ_PHONE_STATE_REQUEST_CODE); // } // }).create().show(); // } else { @@ -140,6 +143,7 @@ public void onGranted() { public void onDenied(List permissions) { makeText(permissions.toString() + "权限拒绝"); } + }); } @@ -168,13 +172,14 @@ public void onGranted() { public void onDenied(List permissions) { makeText(permissions.toString() + "权限拒绝"); } + }); } - // // @Override -// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { +// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] +// grantResults) { // super.onRequestPermissionsResult(requestCode, permissions, grantResults); // //用户选择允许或拒绝后,都会回调此方法 // switch (requestCode) { @@ -201,42 +206,66 @@ public void onDenied(List permissions) { // return PackageManager.PERMISSION_GRANTED == permissionCheck; // } + public void onClickCamera(View view) { + Acp.getInstance(this).request(new AcpOptions.Builder() + .setPermissions(Manifest.permission.CAMERA) + .build(), + new AcpListener() { + @Override + public void onGranted() { + makeText("同意"); + } + + @Override + public void onDenied(List permissions) { + makeText(permissions.toString() + "权限拒绝"); + } + + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); +// Acp.getInstance(this).request(new AcpOptions.Builder() +// .setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE +// , Manifest.permission.READ_PHONE_STATE +// , Manifest.permission.SEND_SMS) +// /*以下为自定义提示语、按钮文字 +// .setDeniedMessage() +// .setDeniedCloseBtn() +// .setDeniedSettingBtn() +// .setRationalMessage() +// .setRationalBtn()*/ +// .build(), +// new AcpListener() { +// @Override +// public void onGranted() { +// writeSD(); +// getIMEI(); +// } +// +// @Override +// public void onDenied(List permissions) { +// makeText(permissions.toString() + "权限拒绝"); +// } +// }); + } + private void writeSD() { File acpDir = getCacheDir("acp", this); if (acpDir != null) makeText("写SD成功:" + acpDir.getAbsolutePath()); } + @SuppressLint("MissingPermission") private void getIMEI() { TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if (tm != null) makeText("读imei成功:" + tm.getDeviceId()); } - public static File getCacheDir(String dirName, Context context) { - File result; - if (existsSdcard()) { - File cacheDir = context.getExternalCacheDir(); - if (cacheDir == null) { - result = new File(Environment.getExternalStorageDirectory(), - "Android/data/" + context.getPackageName() + "/cache/" + dirName); - } else { - result = new File(cacheDir, dirName); - } - } else { - result = new File(context.getCacheDir(), dirName); - } - if (result.exists() || result.mkdirs()) { - return result; - } else { - return null; - } - } - - public static Boolean existsSdcard() { - return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); - } - private void makeText(String text) { Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a5f3418..0d20661 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,63 +1,57 @@ - +