onActivityResult与registerForActivityResult区别及PDF选取实现问题
问题解答
一、MIME类型机制及PDF对应取值
MIME是安卓系统及互联网领域用来统一标识文件格式的标准规范,格式为主类型/子类型,系统会根据该值过滤匹配对应格式的文件。你要选择PDF文件的话,对应的标准MIME类型为application/pdf。
二、疑问解答
- 代码中
ActivityResultLauncher<String>的泛型参数为什么是String?
你当前使用的启动器契约是ActivityResultContracts.GetContent(),该契约预设的输入参数类型就是String(用来传入需要过滤的MIME类型),ActivityResultLauncher的泛型参数对应你调用launch()方法时需要传入的参数类型,因此这里泛型为String。
- 代码中
launch方法需要传入什么参数?
直接传入你需要筛选的MIME类型即可,比如要选PDF就传入"application/pdf",要选所有图片就传入"image/*",和你之前选图片的传值逻辑完全一致。
- 是否可以自定义MIME类型?
可以。只要符合主类型/子类型的格式规则,你完全可以自定义专属的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
相关产品推荐
相关产品推荐

