Skip to content

Commit

Permalink
图片选取增加动态获取权限功能
Browse files Browse the repository at this point in the history
  • Loading branch information
AnliaLee committed Sep 25, 2018
1 parent ec9e470 commit 8bc6733
Show file tree
Hide file tree
Showing 30 changed files with 846 additions and 380 deletions.
Binary file modified .gradle/4.1/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/4.1/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/4.1/fileHashes/resourceHashesCache.bin
Binary file not shown.
Binary file modified .gradle/4.1/javaCompile/classAnalysis.bin
Binary file not shown.
Binary file modified .gradle/4.1/javaCompile/jarAnalysis.bin
Binary file not shown.
Binary file modified .gradle/4.1/javaCompile/javaCompile.lock
Binary file not shown.
Binary file modified .gradle/4.1/javaCompile/taskHistory.bin
Binary file not shown.
Binary file modified .gradle/4.1/javaCompile/taskJars.bin
Binary file not shown.
Binary file modified .gradle/4.1/taskHistory/fileSnapshots.bin
Binary file not shown.
Binary file modified .gradle/4.1/taskHistory/taskHistory.bin
Binary file not shown.
Binary file modified .gradle/4.1/taskHistory/taskHistory.lock
Binary file not shown.
12 changes: 12 additions & 0 deletions .idea/libraries/com_yanzhenjie_permission_2_0_0_rc12.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

737 changes: 546 additions & 191 deletions .idea/workspace.xml

Large diffs are not rendered by default.

27 changes: 25 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ repositories {
}
dependencies {
compile 'com.github.AnliaLee:PhotoFactory:1.1.9'
compile 'com.github.AnliaLee:PhotoFactory:1.2.0'
}
```
Expand All @@ -27,6 +27,7 @@ dependencies {
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
```
***
### 如何使用
Expand Down Expand Up @@ -108,8 +109,30 @@ Uri uri = resultData
"ERROR_PICK_NOT_FOUND": 启动系统相册失败
```

具体示例可参照demo

具体使用流程可参照demo
***

### 1.2.0版本更新内容

针对图片选取增加了动态获取权限的功能(依赖于动态权限框架 [yanzhenjie/AndPermission](https://github.com/yanzhenjie/AndPermission)),即在**Android 6.0**以上调用图片选取功能时不需要再另外编写动态权限相关的代码了

此外,在向用户申请权限时,针对用户有可能执行**不再询问并拒绝权限**的操作,**PhotoFactory**提供了相应的回调和跳转至**应用管理设置界面**的方法,示例如下:

```java
//在Application中或第一次使用PhotoFactory时调用此方法即可
//在回调方法onAction中你可以显示一个对话框让用户选择是否跳转至应用管理界面
PhotoFactory.setPermissionAlwaysDeniedAction(new PermissionAlwaysDenied.Action() {
@Override
public void onAction(Context context, List<String> permissions, final PermissionAlwaysDenied.Executor executor) {
//参数 permissions 为用户拒绝的权限列表
//调用 PhotoFactory.transformPermissionText 可以将权限名称翻译成中文文本
//调用 executor.toSetting() 可以跳转至应用管理界面
}
});
```

具体示例可参照demo

***
#### 搜索图片
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import static org.junit.Assert.*;

/**
* Instrumented test, which will execute on an Android device.
* Instrumented test, which will toSetting on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
Expand Down
2 changes: 2 additions & 0 deletions example/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
<!--往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--拍照权限-->
<uses-permission android:name="android.permission.CAMERA"/>

<application
android:allowBackup="true"
Expand Down
180 changes: 67 additions & 113 deletions example/src/main/java/com/anlia/photofactory/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
package com.anlia.photofactory;

import android.Manifest;
import android.content.pm.PackageManager;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.anlia.photofactory.factory.PhotoFactory;
import com.anlia.photofactory.permission.PermissionAlwaysDenied;
import com.anlia.photofactory.result.ResultData;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.List;

import static com.anlia.photofactory.factory.PhotoFactory.ERROR_CROP_DATA;

Expand All @@ -47,130 +48,83 @@ protected void onCreate(Bundle savedInstanceState) {

picName = Calendar.getInstance().getTimeInMillis() + ".png";

photoFactory = new PhotoFactory(this, Environment.getExternalStorageDirectory() + "/" + "DCIM", picName);
PhotoFactory.setPermissionAlwaysDeniedAction(new PermissionAlwaysDenied.Action() {
@Override
public void onAction(Context context, List<String> permissions, final PermissionAlwaysDenied.Executor executor) {
List<String> permissionNames = PhotoFactory.transformPermissionText(context, permissions);
String permissionText = TextUtils.join("权限\n", permissionNames);

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("权限说明");
builder.setMessage("您禁止了以下权限的动态申请:\n\n" + permissionText + "权限\n\n是否去应用权限管理中手动授权呢?");
builder.setPositiveButton("去授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.toSetting();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
builder.show();
}
});

btnGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//申请写入权限
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 100);
} else {
photoFactory.FromGallery()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG, "取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
photoFactory = new PhotoFactory(MainActivity.this, Environment.getExternalStorageDirectory() + "/" + "DCIM", picName);
photoFactory.FromGallery()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG, "取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
// Uri uri = resultData.GetUri();
// imgPhoto.setImageURI(uri);
}
}

@Override
public void onError(String error) {
@Override
public void onError(String error) {

}
});
}
}
});
}
});

btnCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//申请写入权限
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 101);
} else {
photoFactory.FromCamera()
.AddOutPutExtra()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG, "取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
}

@Override
public void onError(String error) {

}
});
}
photoFactory = new PhotoFactory(MainActivity.this, Environment.getExternalStorageDirectory() + "/" + "DCIM", picName);
photoFactory.FromCamera()
.AddOutPutExtra()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG, "取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
}

@Override
public void onError(String error) {

}
});
}
});
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 100:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
photoFactory.FromGallery()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG,"取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
// Uri uri = resultData.GetUri();
// imgPhoto.setImageURI(uri);
}

@Override
public void onError(String error) {

}
});
} else {// 没有获取到权限,做特殊处理
Toast.makeText(this, "请授予权限!", Toast.LENGTH_SHORT).show();
}
break;

case 101:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
photoFactory.FromCamera()
.AddOutPutExtra()
.StartForResult(new PhotoFactory.OnResultListener() {
@Override
public void onCancel() {
Log.e(TAG, "取消从相册选择");
}

@Override
public void onSuccess(ResultData resultData) {
dealSelectPhoto(resultData);
}

@Override
public void onError(String error) {

}
});
} else {// 没有获取到权限,做特殊处理
Toast.makeText(this, "请授予权限!", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}

private void dealSelectPhoto(ResultData resultData) {
Uri uri = resultData
.setExceptionListener(new ResultData.OnExceptionListener() {
Expand All @@ -197,7 +151,7 @@ public void onSuccess(ResultData data) {

@Override
public void onError(String error) {
switch (error){
switch (error) {
case ERROR_CROP_DATA:
Toast.makeText(MainActivity.this, "data为空", Toast.LENGTH_SHORT).show();
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import static org.junit.Assert.*;

/**
* Example local unit test, which will execute on the development machine (host).
* Example local unit test, which will toSetting on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
Expand Down
6 changes: 3 additions & 3 deletions gradlew.bat
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,16 @@ set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute
if "x%~1" == "x" goto toSetting

set CMD_LINE_ARGS=%*
goto execute
goto toSetting

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
:toSetting
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
Expand Down
12 changes: 7 additions & 5 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,21 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 12
versionName "1.1.9"
versionCode 13
versionName "1.2.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// packageBuildConfig(false)
packageBuildConfig(false)
}

dependencies {
provided fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation ('com.yanzhenjie:permission:2.0.0-rc12') {
exclude group: 'com.android.support'
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import static org.junit.Assert.*;

/**
* Instrumentation test, which will execute on an Android device.
* Instrumentation test, which will toSetting on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
Expand Down
Loading

0 comments on commit 8bc6733

Please sign in to comment.