美文网首页
还在用第三方文件选择器吗?bug太多了android getCo

还在用第三方文件选择器吗?bug太多了android getCo

作者: 吉凶以情迁 | 来源:发表于2023-05-31 10:22 被阅读0次

    官方的文件选择器是我感觉功能最强大的,但是选择带回来的uri,需要解析适配,会遇到各种奇奇怪怪的问题
    比如从特定目录 或者最近的文件进行选择,竟然无法进行解析,

    B~Z8FW_$@V9_ISYG2M%)HM0.png](https://img.haomeiwen.com/i2815884/610db4add44e4e39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![B~Z8FW_$@V9_ISYG2M%)HM0.png

    步入正题

    首先是实现任意地方调用,不需要定义onActivityResult也不需要在onCreate调用registerForActivityResult因此我打算研究其他办法

    刚开始我尝试在fragment中的onCreate中写,也一样会抛出RESUMED之后不能进行registerForActivityResult

    所以只能弄了一个空的act ,透明的,无感的
    xml

        <activity android:name="FileChooseAct"
                android:launchMode="singleInstance"
                android:theme="@android:style/Theme.Translucent.NoTitleBar">
    
            </activity>
    

    act

    public class TFileChooseAct extends FragmentActivity {
        public static Consumer<Uri> resultCallback;
        private static String input;
        private Handler handler;
    
        public static void chooseFileByOfficialAPI(FragmentActivity
                                                           activity, String input, Consumer<Uri> resultCallback) {
            FileChooseAct.resultCallback = resultCallback;
            FileChooseAct.input = input;
            Intent intent = new Intent(activity, TranslateChooseAct.class);
            activity.startActivityForResult(intent, 0);//
        }
    
        Runnable action = new Runnable() {
            @Override
            public void run() {
                TranslateChooseAct.resultCallback = null;
                TranslateChooseAct.input = null;
            }
        };
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            handler = new Handler(Looper.getMainLooper());
            handler.postDelayed(action, 600 * 60);
            ActivityResultLauncher<String> launcher = registerForActivityResult(
                    new ActivityResultContracts.GetContent(),
                    new ActivityResultCallback<Uri>() {
                        @Override
                        public void onActivityResult(Uri result) {
    
                            if (resultCallback == null) {
                                Toast.makeText(TranslateChooseAct.this, "选择超时", Toast.LENGTH_SHORT).show();
                                finish();
                                return;
                            }
                            // 处理返回结果
                            setResult(Activity.RESULT_OK);
                            finish();
                            Consumer<Uri> resultCallback1 = resultCallback;
                            resultCallback1.accept(result);
                            TranslateChooseAct.resultCallback = null;
                            TranslateChooseAct.input = null;
                        }
                    });
            // 发起调用
            launcher.launch(input);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            handler.removeCallbacks(action);
            FileChooseAct.resultCallback = null;
            FileChooseAct.input = null;
        }
    }
    

    上面有一些代码可以不用写,比如考虑到可能内存泄露问题,因为传参我目前是只想到了静态,但是使用静态必须销毁,万一不回调了,岂不是内存泄露了,虽然我测试百分百回调,如果取消,则uri为空依然会回调.
    用法

    chooseFileByOfficialAPI(getThis(), new Consumer<Uri>() {
                        @Override
                        public void accept(Uri uri) {}
    );
    
    

    这样侵入性少,但是多创建了一个act,但是兄嘚,没办法为了方便绕过检测只能这么做了.
    最后是重中之中,解决兼容性问题,网上流行的代码如下:

    相关文章

      网友评论

          本文标题:还在用第三方文件选择器吗?bug太多了android getCo

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