How to Pick Image From Google Photos App Only? Android Google Photos Intent
Asked Answered
N

2

7

I am trying to get an image directly from the Google Photos app. I wish to bypass the app chooser usually started when using Intent.ACTION_GET_CONTENT and instead go directly to Google Photos if the user has it installed and allow the user to select an image which would then be returned to my app in an ActivityResult.

I have attempted to do this in the following manner:

if (callingActivity != null && isGooglePhotosInstalled(callingActivity)) {
    Intent intent = callingActivity.getPackageManager().getLaunchIntentForPackage(GOOGLE_PHOTOS_PACKAGE_NAME);
    intent.setAction(Intent.ACTION_GET_CONTENT); // ALSO TRIED Intent.ACTION_PICK
    intent.setType("image/*");
    try {
        callingActivity.startActivityForResult(intent, MediaPickerActivity.REQUEST_PHOTO_FROM_GOOGLE_PHOTOS);
    } catch (ActivityNotFoundException e) {
        showErrorMsgDialog(callingActivity, "You don't have Google Photos installed! Download it from the play store today.");
        e.printStackTrace();
    }
}

To check if Google Photos is installed I am using:

private static final String GOOGLE_PHOTOS_PACKAGE_NAME = "com.google.android.apps.photos";
public static boolean isGooglePhotosInstalled(Context context) {
    PackageManager packageManager = context.getPackageManager();
    try {
        return packageManager.getPackageInfo(GOOGLE_PHOTOS_PACKAGE_NAME, PackageManager.GET_ACTIVITIES) != null;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Using this method I am able to successfully open Google Photos in selection mode, but upon selecting an image the Google Photos app crashes.

How can I accomplish this?

EDIT: If it helps, I have created a sample app project on Github to help with troubleshooting. The stacktrace of the crash from Google Photos is the following:

09-01 21:30:25.081    1109-1109/? E/Binder﹕ Unbound type: dli
Searched binders:
com.google.android.apps.photos.home.HomeActivity ->
com.google.android.apps.photos.PhotosApplication ->
com.google.android.apps.photos.PhotosApplication
java.lang.IllegalStateException: Unbound type: dli
Searched binders:
com.google.android.apps.photos.home.HomeActivity ->
com.google.android.apps.photos.PhotosApplication ->
com.google.android.apps.photos.PhotosApplication
        at noy.a(PG:210)
        at noy.a(PG:485)
        at hmm.b_(PG:1061)
        at myf.a(PG:54)
        at myc.a(PG:36)
        at hlm.d(PG:242)
        at hll.b(PG:2232)
        at fns.onClick(PG:1375)
        at fnr.onClick(PG:1408)
        at android.view.View.performClick(View.java:4761)
        at android.view.View$PerformClick.run(View.java:19767)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5312)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

Sample Project Found Here: https://github.com/michaelgarnerdev/GooglePhotosIntent

Np answered 1/9, 2015 at 22:1 Comment(0)
D
7

Try the following code:

public void launchGooglePhotosPicker(Activity callingActivity) {
    if (callingActivity != null && isGooglePhotosInstalled()) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setType("image/*");
        List<ResolveInfo> resolveInfoList = callingActivity.getPackageManager().queryIntentActivities(intent, 0);
        for (int i = 0; i < resolveInfoList.size(); i++) {
            if (resolveInfoList.get(i) != null) {
                String packageName = resolveInfoList.get(i).activityInfo.packageName;
                if (GOOGLE_PHOTOS_PACKAGE_NAME.equals(packageName)) {
                    intent.setComponent(new ComponentName(packageName, resolveInfoList.get(i).activityInfo.name));
                    callingActivity.startActivityForResult(intent, REQUEST_PHOTO_FROM_GOOGLE_PHOTOS);
                    return;
                }
            }
        }
    }
}
Duncan answered 2/9, 2015 at 6:5 Comment(8)
Thank you for your answer, but unfortunately I am still seeing the same crash from Google Photos and the image is not being returned. I have added a sample project on GitHub if you are interested in directly changing and testing code. I tried ACTION_PICK first, but changed it to ACTION_GET_CONTENT to see if it would make a difference and it didn't. :(Np
Actually, does Google Photos return normally if you use Intent.createChooser?Duncan
Yes I think so, but I don't want to create a chooser. I want to strictly limit input to being from GooglePhotos.Np
I mean you should actually try that as a control experiment, it looks like not a problem with the codeDuncan
Are you suggesting passing the intent we built into Intent.createChooser() or scrapping the current intent and going with a straightforward Image chooser intent?Np
If it's the latter, I know that works and there are plenty of examples of it working. If you're talking about passing the current intent into Intent.createChooser() then unfortunately that doesn't help either. It might just be a bug with GooglePhotosNp
downloaded your git project and fixed it, check edit, you didn't incorporate all the changes I saidDuncan
Oopsies. Suggested an edit for your answer and accepted. Thank you!Np
B
6

You could just use intent.setPackage():

Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
intent.setPackage(GOOGLE_PHOTOS_PACKAGE_NAME);
callingActivity.startActivityForResult(intent, REQUEST_PHOTO_FROM_GOOGLE_PHOTOS);
Bellarmine answered 28/9, 2015 at 9:57 Comment(1)
The documentation says getData() needs to point to a directory to pick from. Is it OK to omit that, as you are showing in this example? developer.android.com/reference/android/content/…Scintillation

© 2022 - 2024 — McMap. All rights reserved.