aurelianr
aurelianr

Reputation: 549

an android file picker or camera for taking pictures or videos not working on nexus 4

I am trying to open an android file picker or camera for taking pictures or videos using the following code:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICKFILE_RESULT_CODE && Activity.RESULT_OK == resultCode) {
            try {
                // Get the Uri of the selected file 
                Uri uri = data.getData();
                LogS.d("File Uri: " + uri.toString());
                // Get the path
                String path = BeanUtils.getPath(getActivity().getApplicationContext(), uri);

                AnnexFile f = new AnnexFile(path);
                if (!addedFiles.contains(f)) {
                    addFileToLayout(f);
                    addedFiles.add(f);
                } else {
                    Toast.makeText(getActivity(), R.string.you_allready_added_this_file_, Toast.LENGTH_SHORT).show();;
                }
            } catch (Exception e) {
                LogS.e(e);
                Toast.makeText(getActivity(), getString(R.string.file_manager_invalid), Toast.LENGTH_LONG).show();
            }
        } else if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && Activity.RESULT_OK == resultCode) {
            try {
                Uri uri = data.getData();
                LogS.d("File Uri: " + uri.toString());
                // Get the path
                String path = BeanUtils.getPath(getActivity().getApplicationContext(), uri);

                AnnexFile f = new AnnexFile(path);
                if (!addedFiles.contains(f)) {
                    addFileToLayout(f);
                    addedFiles.add(f);
                } else {
                    Toast.makeText(getActivity(), R.string.you_allready_added_this_file_, Toast.LENGTH_SHORT).show();;
                }
            } catch (Exception e) {
                LogS.e(e);
                Toast.makeText(getActivity(), getString(R.string.file_manager_invalid), Toast.LENGTH_LONG).show();
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    private void openImageIntent() {

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getActivity().getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for (ResolveInfo res : listCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        cameraIntents.add(intent);
    }

    final Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    final List<ResolveInfo> listVideoCam = packageManager.queryIntentActivities(videoIntent, 0);
    for (ResolveInfo res : listVideoCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(videoIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        cameraIntents.add(intent);
    }

    //FileSystem
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/*;video/*");
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

    // Chooser of filesystem options.
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
    startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

}

The code works perfect on Samsung S4 and Sony Experia J but fails on Nexus 4 (android 5.1.1). When I debugged the application on nexus 4 I found that the following Uri uri = data.getData(); is null if the end user tries to make a picture. The application works on all devices if the user tries to make a video or to open an existing media file.

Upvotes: 0

Views: 835

Answers (1)

CommonsWare
CommonsWare

Reputation: 1007399

When I debugged the application on nexus 4 I found that the following Uri uri = data.getData(); is null if the end user tries to make a picture

You are assuming that ACTION_IMAGE_CAPTURE returns a result in the form of a Uri. It is not documented to do so. There are thousands of camera apps, pre-installed and user-installed. Many of them will advertise support for ACTION_IMAGE_CAPTURE. None have to return a Uri result.

Upvotes: 1

Related Questions