咱們知道Android裏面啓動一個Activity For Result時,回調會回到原來這個Activity的OnActivityResult中,若是此時,你正在寫一個其餘組件,而不能直接依賴這個Activity那是否是很尷尬?
還有當咱們在寫一個圖片庫組件時,發現要請求權限,權限請求完後在進行操做,但是權限請求的回調依然在Activity中的onRequestPermissionsResult,那咱們怎麼作呢?
今天介紹一個開源庫 ActivityResultPermission ,一個用於幫助OnActivityResult,PermissionRequest 解耦合的庫,不須要依賴Activity中的回調.java
解耦合Activity中的回調,有兩種方式react
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import io.reactivex.functions.Action;
public class HolderActivity extends Activity {
private static Request request;
private OnPreResult onPreResult;
private OnResult onResult;
private int resultCode;
private int requestCode;
private Intent data;
private static int FAILED_REQUEST_CODE = -909;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (request == null) {
finish();
return;
}
onPreResult = request.onPreResult();
onResult = request.onResult();
if (savedInstanceState != null) return;
if (request instanceof RequestIntentSender) {
RequestIntentSender requestIntentSender = (RequestIntentSender) request;
if (requestIntentSender.getOptions() == null) startIntentSender(requestIntentSender);
else startIntentSenderWithOptions(requestIntentSender);
} else {
try {
startActivityForResult(request.intent(), 0);
} catch (ActivityNotFoundException e) {
if (onResult != null) {
onResult.error(e);
}
}
}
}
private void startIntentSender(RequestIntentSender requestIntentSender) {
try {
startIntentSenderForResult(requestIntentSender.getIntentSender(), 0,
requestIntentSender.getFillInIntent(), requestIntentSender.getFlagsMask(),
requestIntentSender.getFlagsValues(), requestIntentSender.getExtraFlags());
} catch (IntentSender.SendIntentException exception) {
exception.printStackTrace();
onResult.response(FAILED_REQUEST_CODE, RESULT_CANCELED, null);
}
}
private void startIntentSenderWithOptions(RequestIntentSender requestIntentSender) {
try {
startIntentSenderForResult(requestIntentSender.getIntentSender(), 0,
requestIntentSender.getFillInIntent(), requestIntentSender.getFlagsMask(),
requestIntentSender.getFlagsValues(), requestIntentSender.getExtraFlags(), requestIntentSender.getOptions());
} catch (IntentSender.SendIntentException exception) {
exception.printStackTrace();
onResult.response(FAILED_REQUEST_CODE, RESULT_CANCELED, null);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
this.resultCode = resultCode;
this.requestCode = requestCode;
this.data = data;
if (this.onPreResult != null) {
this.onPreResult.response(requestCode, resultCode, data)
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
finish();
}
})
.subscribe();
} else {
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (onResult != null)
onResult.response(requestCode, resultCode, data);
}
static void setRequest(Request aRequest) {
request = aRequest;
}
}
複製代碼
import android.app.Fragment;
import android.content.Intent;
import androidx.annotation.NonNull;
/** * author:DingDeGao * time:2019-07-16-14:30 * function: ReplaceFragment */
public class ReplaceFragment extends Fragment {
static final int ACTIVITY_REQUEST_CODE = 100;
static final int PERMISSION_REQUEST_CODE = 101;
private IHandle iHandle;
public void setIHandle(IHandle iHandle) {
this.iHandle = iHandle;
}
public IHandle getIHandle(){
return iHandle;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != ACTIVITY_REQUEST_CODE) return;
if(iHandle != null){
iHandle.onActivityResultHandle(resultCode,data);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode != PERMISSION_REQUEST_CODE) return;
if(iHandle != null){
iHandle.onRequestPermissionsResultHandle(getActivity(),permissions,grantResults);
}
}
}
複製代碼
RxActivityResult,RxPermission採用都是前者,而此處採用了後者,使用Fragment.android
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.DingProg:ActivityResultPermission:v0.0.1'
}
複製代碼
Intent intent = new Intent(this, OnActivityResultActivity.class);
//經過ActivityResultPermissionUtils 去啓動Activity,並註冊其回調
ActivityResultPermissionUtils.startActivityForResult(this, intent).activityResult(new Listener.ResultListener() {
@Override
public void onResult(Intent data) {
if (data != null) {
String testStr = data.getStringExtra("test");
Toast.makeText(MainActivity.this, "openActivity with result is:" + testStr, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "openActivity with result cancel", Toast.LENGTH_SHORT).show();
}
});
複製代碼
ActivityResultPermissionUtils.requestPermissions(this, Manifest.permission.CAMERA).permissions(new Listener.PermissionResultListener() {
@Override
public void permissionDenied(String permission, boolean rationale) {
//rationale if true 僅僅點擊了禁止
if(rationale){
Toast.makeText(MainActivity.this, "Denied permission", Toast.LENGTH_SHORT).show();
}else{
//點擊禁止權限,並不容許在彈出
Toast.makeText(MainActivity.this, "Denied permission with ask never", Toast.LENGTH_SHORT).show();
PermissionGoSettingsPageUtils.go(MainActivity.this);
}
}
@Override
public void permissionGranted() {
releaseCamera();
try{
camera = Camera.open(0);
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
}catch (Exception e){
e.printStackTrace();
}
}
});
複製代碼
若是對於一些非正常Rom(如oppo,vivo手機),能夠調用PermissionUtils.checkSelfPermissionsWhitNoNoramal(context,permissions);git
請求權限時,調用ActivityResultPermissionUtils.requestPermissions(this, permission).permissionsWithoutCheck();github
關於更多請查看sample ActivityResultPermissionbash