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
答案 0 :(得分:5)
请尝试以下代码:
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;
}
}
}
}
}
答案 1 :(得分:3)
你可以使用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);