You need to enable JavaScript to run this app. onActivityResult与registerForActivityResult区别及PDF选取实现问题
优惠活动
大模型
产品
解决方案
定价
更多

onActivityResult与registerForActivityResult区别及PDF选取实现问题

问题解答

一、MIME类型机制及PDF对应取值

MIME是安卓系统及互联网领域用来统一标识文件格式的标准规范,格式为主类型/子类型,系统会根据该值过滤匹配对应格式的文件。你要选择PDF文件的话,对应的标准MIME类型为application/pdf。

二、疑问解答

    1. 代码中ActivityResultLauncher<String>的泛型参数为什么是String?
      你当前使用的启动器契约是ActivityResultContracts.GetContent(),该契约预设的输入参数类型就是String(用来传入需要过滤的MIME类型),ActivityResultLauncher的泛型参数对应你调用launch()方法时需要传入的参数类型,因此这里泛型为String。
    1. launch方法需要传入什么参数?
      直接传入你需要筛选的MIME类型即可,比如要选PDF就传入"application/pdf",要选所有图片就传入"image/*",和你之前选图片的传值逻辑完全一致。
    1. 是否可以自定义MIME类型?
      可以。只要符合主类型/子类型的格式规则,你完全可以自定义专属的MIME类型用于你的应用私有文件匹配,系统仅会按照传入的字符串做匹配过滤,不会强制校验该MIME是否为官方收录的标准类型。

三、修改代码实现PDF导入

你现有代码是处理图片选择的逻辑,修改为PDF选择需要调整回调里的处理逻辑,同时修正原有代码中的拼写错误(比如不存在的eventSpinner、preview_events_image变量),核心修改后的代码如下:
注意需要额外导入Cursor和OpenableColumns的相关依赖包

package com.parth.iitktimes;

import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.card.MaterialCardView;

public class addBooks extends AppCompatActivity {
    private MaterialCardView selectImage;
    private TextView docName;
    private Spinner semSpinner, branchSpinner;
    private Button btnUpload;
    private ActivityResultLauncher<String> someActivityResultLauncher;
    private String selectedSem, selectedBranch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_books);
        selectImage = findViewById(R.id.select_image);
        docName = findViewById(R.id.tvDocName);
        semSpinner = findViewById(R.id.spinner_sem);
        branchSpinner = findViewById(R.id.spinner_branch);
        btnUpload = findViewById(R.id.btnUploadNotes);

        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "uploaded notes successfully", Toast.LENGTH_SHORT).show();
            }
        });
        selectImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 传入PDF对应的MIME类型
                someActivityResultLauncher.launch("application/pdf");
            }
        });

        String[] semesterItems = {"First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, semesterItems);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        semSpinner.setAdapter(adapter);

        semSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                selectedSem = semesterItems[i];
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                selectedSem = semesterItems[0];
            }
        });

        String[] branchItems = {"Mechanical", "Electrical", "CSE", "MTH"};
        ArrayAdapter<String> branchAdapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, branchItems);
        branchAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        branchSpinner.setAdapter(branchAdapter);

        branchSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                selectedBranch = branchItems[i];
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                selectedBranch = branchItems[0];
            }
        });

        // 启动器回调改为处理PDF逻辑
        someActivityResultLauncher = registerForActivityResult(
                new ActivityResultContracts.GetContent(), new ActivityResultCallback<Uri>() {
                    @Override
                    public void onActivityResult(Uri result) {
                        if (result == null) return;
                        // 获取PDF文件名显示到界面
                        String fileName = null;
                        Cursor cursor = getContentResolver().query(result, null, null, null, null);
                        if (cursor != null && cursor.moveToFirst()) {
                            fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
                            cursor.close();
                        }
                        docName.setText(fileName);
                        // 后续如果需要上传PDF,可以通过该Uri读取文件流处理
                    }
                });
    }
}

内容的提问来源于stack exchange,提问作者Parth Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 06:27:02