如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图

Posted

技术标签:

【中文标题】如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图【英文标题】:How to Pick Image From Google Photos App Only? Android Google Photos Intent 【发布时间】:2015-11-27 06:40:30 【问题描述】:

我正在尝试从 Google 照片应用直接获取图片。我希望绕过通常在使用Intent.ACTION_GET_CONTENT 时启动的应用选择器,而是直接转到 Google 照片(如果用户已安装它)并允许用户选择一张图片,然后该图片将在 ActivityResult 中返回到我的应用。

我已尝试通过以下方式执行此操作:

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();
    

要检查我是否安装了 Google 相册,我正在使用:

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;
    

使用此方法,我可以在选择模式下成功打开 Google 相册,但在选择图片时,Google 相册应用会崩溃。

我怎样才能做到这一点?

编辑: 如果有帮助,我在 Github 上创建了一个示例应用程序项目来帮助进行故障排除。来自 Google 照片的崩溃堆栈跟踪如下:

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)

在这里找到的示例项目: https://github.com/michaelgarnerdev/GooglePhotosIntent

【问题讨论】:

【参考方案1】:

试试下面的代码:

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;
                
            
        
    

【讨论】:

感谢您的回答,但不幸的是,我仍然从 Google 照片中看到同样的崩溃,并且图像未返回。如果您有兴趣直接更改和测试代码,我在 GitHub 上添加了一个示例项目。我首先尝试了ACTION_PICK,但将其更改为ACTION_GET_CONTENT,看看它是否会有所作为,但没有。 :( 其实,如果你使用Intent.createChooser,谷歌相册能正常返回吗? 是的,我想是的,但我不想创建选择器。我想严格限制来自 GooglePhotos 的输入。 我的意思是你应该把它作为一个对照实验来尝试,看起来代码没有问题 您是建议传递我们在Intent.createChooser() 中构建的意图还是放弃当前意图并使用简单的图像选择器意图?【参考方案2】:

你可以只使用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);

【讨论】:

以上是关于如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图的主要内容,如果未能解决你的问题,请参考以下文章

仅从datetime中选择日期部分

iOS APP删除系统相册中选中的图片-姬云鹏

如何仅从 google adword api 整合地理位置?

权限被拒绝:打开未从 uid 导出的提供程序 com.google.android.apps.photos.contentprovider.MediaContentProvider

仅从Google Signs In for Websites请求“openid”范围

GetCurrent 用户仅从 Firebase Google 应用返回登录用户