在Fragment中,startActivityForResult不起作用。
在Fragment中,startActivityForResult不起作用。
我正在尝试从相机或图库中获取图像,以下是我正在运行的代码,但是在startActivityForResult
中出现错误:
public class NewPatient extends Fragment { Button Takeimage, save, cancel; int REQUEST_CAMERA = 0, SELECT_FILE = 1; ImageView imageview1; Uri imageUri; private Bitmap bitmap; MediaPlayer mp = new MediaPlayer(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View myFragmentView = inflater.inflate(R.layout.activity_new_patient, container, false); imageview1 = (ImageView) myFragmentView.findViewById(R.id.imageNP); Takeimage = (Button) myFragmentView.findViewById(R.id.takeimg); save = (Button) myFragmentView.findViewById(R.id.save); cancel = (Button) myFragmentView.findViewById(R.id.cancel); Pakage = (Spinner) myFragmentView.findViewById(R.id.packages); Takeimage.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { selectImage(); } }); imageview1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { getActivity().openOptionsMenu(); } }); return myFragmentView; } private void selectImage() { final CharSequence[] items = { "拍照", "从图库选择", "取消" }; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("添加照片!"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { if (items[item].equals("拍照")) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_CAMERA); } else if (items[item].equals("从图库选择")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult( Intent.createChooser(intent, "选择文件"), SELECT_FILE); } else if (items[item].equals("取消")) { dialog.dismiss(); } } }); builder.show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_FILE) onSelectFromGalleryResult(data); else if (requestCode == REQUEST_CAMERA) onCaptureImageResult(data); } } private void onCaptureImageResult(Intent data) { Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes); File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); FileOutputStream fo; try { destination.createNewFile(); fo = new FileOutputStream(destination); fo.write(bytes.toByteArray()); fo.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } imageview1.setImageBitmap(thumbnail); } @SuppressWarnings("deprecation") private void onSelectFromGalleryResult(Intent data) { Uri selectedImageUri = data.getData(); String[] projection = { MediaColumns.DATA }; Cursor cursor = getActivity().managedQuery(selectedImageUri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); String selectedImagePath = cursor.getString(column_index); Bitmap bm; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(selectedImagePath, options); final int REQUIRED_SIZE = 200; int scale = 1; while (options.outWidth / scale / 2 >= REQUIRED_SIZE && options.outHeight / scale / 2 >= REQUIRED_SIZE) scale *= 2; options.inSampleSize = scale; options.inJustDecodeBounds = false; bm = BitmapFactory.decodeFile(selectedImagePath, options); imageview1.setImageBitmap(bm); }
这就是我的代码,但是我不知道问题在哪里,我无法理解它。
有人可以帮帮我吗?
问题出现的原因:
在Fragment中调用startActivityForResult方法时,无法正常工作。
解决方法:
1. 在Fragment中调用startActivityForResult方法时,需要确保父Activity中也重写了onActivityResult方法,并且在父Activity中调用了super.onActivityResult方法。这样才能正确地将结果传递给Fragment。
2. 确保在调用startActivityForResult方法时,传递的requestCode参数与在onActivityResult方法中进行判断的requestCode参数相匹配。
3. 确保在调用startActivityForResult方法时,传递的Intent参数正确地设置了action和category属性,以确保能够选择到正确的图片。
以下是一个解决方案的示例代码:
// 在Fragment中调用startActivityForResult方法 case R.id.browse_pic: Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, SELECT_REQUEST); break; // 在父Activity中重写onActivityResult方法,并调用super.onActivityResult方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 将结果传递给Fragment fragment.onActivityResult(requestCode, resultCode, data); } // 在Fragment中重写onActivityResult方法,处理结果 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SELECT_REQUEST && resultCode == Activity.RESULT_OK) { // 处理选择图片的结果 try { InputStream stream = getActivity().getContentResolver().openInputStream(data.getData()); pic = BitmapFactory.decodeStream(stream); stream.close(); imageView.setImageBitmap(pic); } catch (Exception e) { e.printStackTrace(); } } }
通过以上的解决方法,可以解决在Fragment中调用startActivityForResult方法无法正常工作的问题。