diff --git a/README.md b/README.md index adec374..0322741 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,22 @@ # 效果图 -#使用Gradle构建时添加一下依赖即可: +#使用Gradle构建时添加一下依赖即可 +Step 1. Add the JitPack repository to your build file +Add it in your root build.gradle at the end of repositories: ```javascript -compile 'com.mylhyl:acp:1.1.7' + allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } + } +``` +Step 2. Add the dependency +``` + dependencies { + implementation 'com.github.mylhyl:AndroidAcp:1.2.2' + } ``` # 使用说明 @@ -45,8 +58,6 @@ compile 'com.mylhyl:acp:1.1.7' ### [下载APK体验](/preview/sample-debug.apk) -## QQ交流群:435173211 - #### 版本日志 > 1.1.7 修复内存泄露 @@ -58,4 +69,4 @@ compile 'com.mylhyl:acp:1.1.7' > 1.0.2 修复申请的权限不在`AndroidManifest.xml`配置文件时,中仍然显示`RationalMessage`对话框的问题 -> 1.0.1 修改 minSdkVersion 14 \ No newline at end of file +> 1.0.1 修改 minSdkVersion 14 diff --git a/acp/build.gradle b/acp/build.gradle deleted file mode 100644 index 9b2f45d..0000000 --- a/acp/build.gradle +++ /dev/null @@ -1,103 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' - -android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" - defaultConfig { - minSdkVersion 14 - targetSdkVersion 23 - versionCode 1 - versionName version - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - lintOptions { - abortOnError false - } -} - -def siteUrl = 'https://github.com/mylhyl/AndroidAcp' -def gitUrl = 'https://github.com/mylhyl/AndroidAcp.git' - -group = "com.mylhyl" -version = "1.1.7" - -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' -} 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/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..b1ab9e9 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.mylhyl.acp.sample" + minSdkVersion 15 + targetSdkVersion 28 + versionCode 1 + versionName "20180425" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + lintOptions { + abortOnError false + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':library') + implementation 'com.android.support:appcompat-v7:28.0.0' + 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' + implementation 'com.yanzhenjie.permission:support:2.0.1' +} 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 57% rename from sample/src/main/AndroidManifest.xml rename to app/src/main/AndroidManifest.xml index 9abf3a3..3c2c2e0 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,31 @@ + package="com.mylhyl.acp.sample"> - - - + + + + + + + + + + + - + - + 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 50% rename from sample/src/main/java/com/mylhyl/acp/sample/App.java rename to app/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/app/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); } } 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 90% rename from sample/src/main/java/com/mylhyl/acp/sample/BlankActivity.java rename to app/src/main/java/com/mylhyl/acp/sample/BlankActivity.java index da19727..61493eb 100644 --- a/sample/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/sample/src/main/java/com/mylhyl/acp/sample/MainActivity.java b/app/src/main/java/com/mylhyl/acp/sample/MainActivity.java similarity index 77% rename from sample/src/main/java/com/mylhyl/acp/sample/MainActivity.java rename to app/src/main/java/com/mylhyl/acp/sample/MainActivity.java index 50004a1..ed1da67 100644 --- a/sample/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() + "权限拒绝"); } + }); } @@ -157,24 +161,29 @@ public void onGranted() { startActivity(intentCall); */ - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_CALL); - intent.setData(Uri.parse("tel:13800138000")); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); + try { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_CALL); + intent.setData(Uri.parse("tel:13800138000")); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + } } @Override 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 +210,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 new file mode 100644 index 0000000..0d20661 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,57 @@ + + + +