有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓如何在Java类中封装startActivityForResult,并在调用该方法的活动上获取onActivityResult

我在几个活动中使用下一个摄像头代码,我想创建一个类来封装在Android中使用摄像头的方法

我想要得到的是活动类,类似于:

Public class Myfragment extends Fragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.profile_fragment, container, false);
        mButtonProfilePhoto = v.findViewById(R.id.buttonProfilePhoto);

        mButtonProfilePhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        //Here I call the camera intent.
            Camera.dispatchTakePictureIntent(getActivity(), mPhotoFile);
            }
            });

    return v;
    }
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
              //handle the camera result
}

Camera类如下所示:

public class Camera{
public static void dispatchTakePictureIntent(Activity activity, File file) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
        // Create the File where the photo should go
        file = null;
        try {
            file = Camera.createImageFile(activity);
        } catch (IOException ex) {
            // Error occurred while creating the File

        }
        // Continue only if the File was successfully created
        if (file  != null) {
            Uri photoURI = FileProvider.getUriForFile(activity,
                    "com.itcom202.weroom.fileprovider",
                    file );
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult( takePictureIntent, REQUEST_IMAGE_CAPTURE);


        }
    }
}
}

我现在遇到的问题是,我从未从片段中收到来自onActivityResult的回调


共 (1) 个答案

  1. # 1 楼答案

    OS不支持将onActivityResult()发送到Fragment的。不过,支持库有一种机制可以做到这一点,即注册对AppCompatActivity中特殊表的调用。这里的技巧是,您必须使用Fragment自己的^{},而不是Activity

    因此,您的Camera类代码应该如下所示:

    public class Camera{
    
        public static void dispatchTakePictureIntent(Activity activity, Fragment fragment, File file) {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Ensure that there's a camera activity to handle the intent
            if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
                // Create the File where the photo should go
                file = null;
                try {
                    file = Camera.createImageFile(activity);
                } catch (IOException ex) {
                    // Error occurred while creating the File
    
                }
                // Continue only if the File was successfully created
                if (file  != null) {
                    Uri photoURI = FileProvider.getUriForFile(activity,
                            "com.itcom202.weroom.fileprovider",
                            file );
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                    fragment.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                }
            }
        }
    
    }
    

    注意,最后一行使用了FragmentstartActivityForResult()