아직도 타사 파일 선택기를 사용하고 있습니까?버그가 너무 많습니다.android getContent 공식 내장 파일 관리자 선택 적응은 문서 유형을 구문 분석할 수 없는 문제를 해결합니다...


제 생각에는 공식 파일 선택기가 가장 강력하지만 다시 가져온 uri는 구문 분석 및 조정이 필요하며 특정 디렉토리 또는 가장 최근 파일에서 선택하는 것과 같은 다양한 이상한 문제가 발생하지만 구문 분석할 수 없습니다.

B~Z8FW_$@V9_ISYG2M%)HM0.png](https://upload-images.jianshu.io/upload_images/2815884-610db4add44e4e39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![B~Z8FW_$@V9_ISYG2M%)HM0. png

사업에 착수하다

첫 번째는 어디에서나 호출을 구현하는 것입니다. onActivityResult를 정의하거나 onCreate를 호출할 필요가 없으므로 registerForActivityResult다른 방법을 연구할 계획입니다.

처음에 프래그먼트에 onCreate를 쓰려고 했는데 이것도 RESUMED를 던지고 계속 안되네요.registerForActivityResult

그래서 나는 공허한 행위, 투명하고 무감각한
xml을 만들 수 밖에 없다.

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

        </activity>

행동

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;
    }
}

위의 코드는 쓰지 않고 쓸 수 있는 코드가 있는데, 예를 들어 가능한 메모리 누수 문제를 고려하면 나는 매개변수를 전달할 때 정적만 생각하기 때문에 정적을 사용하는 것은 파기되어야 하고, 콜백되지 않으면 메모리 누수가 아니다
.

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

이게 덜 거슬리긴 한데 행위가 하나 더 생기는데 형님 편의상 탐지를 우회할 방법이 없네요
결국 제일 중요한건 호환성 문제 해결입니다 인터넷에서 유행하는 코드는 다음과 같습니다.

추천

출처blog.csdn.net/u010042660/article/details/130990873