美文网首页
Android截图开发工具

Android截图开发工具

作者: 米豆同学 | 来源:发表于2019-07-17 11:02 被阅读0次

    ScreenshotUtil实现

    最近多次在项目中用到截图功能,于是封装了一个截图工具,使用MediaProjection实现截图,权限申请使用了RxActivityResult。
    使用方法:

    1. 在Application中注册
    public class MyApp  extends Application {
    
        @Override public void onCreate() {
            super.onCreate();
            ScreenshotUtil.register(this);
        }
    }
    
    1. 在on方法中传入Activity 对象,在subscribe中处理截图的结果Bitmap
    ScreenshotUtil.on(this).takeScreenshot().subscribe(bitmap -> { if (bitmap == null) {
        Log.e(TAG, "Bitmap is null.");
    } else {
         mImageView.setImageBitmap(bitmap);
    }});
    

    Github: https://github.com/MissMidou/Android-Develop-Tool

    RxActivityResult 实现原理

    在startActivityForResult 时,需要在onActivityResult 中处理返回结果,而使用RxActivityResult,可以不用重写onActivityResult来直接处理返回结果,代码简介清晰。

    Github: https://github.com/VictorAlbertos/RxActivityResult
    使用范例:

    public class SampleApp extends Application {
    
        @Override public void onCreate() {
            super.onCreate();
            RxActivityResult.register(this);
        }
    }
    

    RxActivityResult.register(this);用于判断在顶层的Activity的生命周期,用这个Activity打开目标Activity

    Intent takePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
    RxActivityResult.on(this).startIntent(takePhoto)
            .subscribe(result -> {
                Intent data = result.data();
                int resultCode = result.resultCode();
                // the requestCode using which the activity is started can be received here.
                int requestCode = result.requestCode();
    
                if(requestCode == YourActivity.YOUR_REQUEST_CODE)
                {
                    // Do Something
                }
    
                if (resultCode == RESULT_OK) {
                    result.targetUI().showImage(data);
                } else {
                    result.targetUI().printUserCanceled();
                }
            });
    

    on()返回一个Builder 对象,Builder中创建一个PublishSubject实例,PublishSubject与普通Observable相比,Observable是订阅时立即触发订阅事件,而PublishSubject可以在任意时刻调用onNext,onComplete方法触发订阅事件,观察者在订阅之后便可以收到事件,这里在onActivityResult返回结果后,触发订阅事件

        public static <T extends Activity> Builder<T> on(T activity) {
            return new Builder<T>(activity);
        }
        public static class Builder<T> {
            final Class clazz;
            final PublishSubject<Result<T>> subject = PublishSubject.create();
            private final boolean uiTargetActivity;
            ... ...
        }
    

    startIntent()调用startHolderActivity,通过打开一个HolderActivity,然后在HolderActivity中打开目标Activity,并在onActivityResult处理结果

            private Observable<Result<T>> startHolderActivity(Request request, @Nullable OnPreResult onPreResult) {
    
                OnResult onResult = uiTargetActivity ? onResultActivity() : onResultFragment();
                request.setOnResult(onResult);
                request.setOnPreResult(onPreResult);
    
                HolderActivity.setRequest(request);
                //getOLiveActivity找到顶层Activity,因为在Fragment中打开的时候需要Activity
                activitiesLifecycle.getOLiveActivity().subscribe(new Consumer<Activity>() {
                    @Override
                    public void accept(Activity activity) throws Exception {
                        activity.startActivity(new Intent(activity, HolderActivity.class)
                                .addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                    }
                });
    
                return subject;
            }
    

    HolderActivity打开目标Activity后,onActivityResult中保存结果并finish,然后onDestroy 中发射订阅事件
    HolderActivity.java

        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (onResult != null)
                onResult.response(requestCode, resultCode, data);
        }
    
            private OnResult onResultActivity() {
                return new OnResult() {
                    @Override
                    public void response(int requestCode, int resultCode, Intent data) {
                        if (activitiesLifecycle.getLiveActivity() == null) return;
    
                        //If true it means some other activity has been stacked as a secondary process.
                        //Wait until the current activity be the target activity
                        if (activitiesLifecycle.getLiveActivity().getClass() != clazz) {
                            return;
                        }
    
                        T activity = (T) activitiesLifecycle.getLiveActivity();
                        subject.onNext(new Result<>(activity, requestCode, resultCode, data));
                        subject.onComplete();
                    }
    
                    @Override
                    public void error(Throwable throwable) {
                        subject.onError(throwable);
                    }
                };
            }
    

    参考文档:

    http://gank.io/post/560e15be2dca930e00da1083#toc_17

    相关文章

      网友评论

          本文标题:Android截图开发工具

          本文链接:https://www.haomeiwen.com/subject/ffxqlctx.html