action.SEND intent-filter在android API 26(Oreo)中不起作用

时间:2017-12-13 09:47:42

标签: android android-intent android-8.0-oreo

  1. 使用场景: 我想让我的应用程序的用户能够分享我的应用程序的图像截图内容到我自己的应用程序的特定活动(社区页面)以及其他类似SNS的应用程序(facebook,instagram,WhatsApp,等等)。这意味着,当用户点击“我的应用”中的“分享”按钮时,我的应用图标应该显示在Sharevia应用列表中。
  2. 问题: 在Android API 26(奥利奥操作系统) 中,我的应用图标在Sharevia中显示 用户点击“分享”按钮时的应用列表。相比之下,在API 25 N OS中,它运行良好。 (我已经测试过Google安卓参考设备,Pixel。)
  3. 代码:

    private static void showShareViaDialog(final Context context, ArrayList<Uri> shareFileUris) {
    if (context == null || shareFileUris == null) {
        LOG.e(TAG, "Either context or Uri list object is null");
        ToastView.makeCustomView(ContextHolder.getContext(), R.string.share_image_storage_error, Toast.LENGTH_LONG).show();
        return;
    }
    
    Intent sendingIntent;
    Intent chooserActivity;
    if (shareFileUris.size() <= 0) {
        LOG.e(TAG, "Uri list is empty");
        return;
    
    if (shareFileUris.size() == 1) {
        LOG.d(TAG, " showShareViaDialog() : only one file is about to share ");
        sendingIntent = new Intent(Intent.ACTION_SEND);
        sendingIntent.setType("image/png");
        sendingIntent.putExtra(Intent.EXTRA_STREAM, shareFileUris.get(0));
        sendingIntent.putExtra(THEME_CHOOSER, THEME_DEVICE_DEFAULT_LIGHT);
        sendingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        chooserActivity = Intent.createChooser(sendingIntent, context.getResources().getText(R.string.share_via));
    
    if (chooserActivity != null) {
        LOG.d(TAG, " showShareViaDialog() : chooser activity is " + chooserActivity.getClass());
        chooserActivity.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        LockManager.getInstance().registerIgnoreActivity(context.getClass());
        List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(chooserActivity,
            PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resolveInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            context.grantUriPermission(packageName, shareFileUris.get(0), Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
        }
        LOG.d(TAG, " showShareViaDialog() : chooser activity is starting " + chooserActivity.getClass());
        context.startActivity(chooserActivity);
    }
    
  4. 意图发送部分代码

        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/png" />
        </intent-filter>
    

    AndroidManifest.xml中的Intent-filter

    起初,我只是认为它与Android Oreo Broadcast Limitations有关。但是,action.SEND是活动Intent,而不是广播Intent。我发现了我的一些相反的案例问题Why is my ACTION_SEND working on API 25+ perfectly, but messes up on previous APIs?。这很有趣。

    为什么此流程作业在API 26中不起作用?是否有更多的事情要做以接受行动。在API 26中的意图?

    ++更多信息,

      

    shareFileUris.get(0)。我们不知道您尝试分享的内容。请   给出Uri.toString()的值。 - greenapps 14分钟前

    这是一个指示PNG类型图像文件的uri。请参考以下代码。

                        Uri shareUri;
                    if (android.os.Build.VERSION.SDK_INT > ANDROID_BUILD_VERSION_LOLLIPOP) {
                        shareUri = FileProvider.getUriForFile(SHARE_VIA_AUTHORITY, file);
                        LOG.d(TAG, " doInBackground(): share Uri through FileProvider  " + shareUri.toString());
    
                    } else {
                        shareUri = Uri.fromFile(file);
                        LOG.d(TAG, " doInBackground(): share Uri through Uri apis  " + shareUri.toString());
    
                    }
                    //  context.grantUriPermission();
                    //                   Uri shareUri = Uri.fromFile(file);
                    shareUris = new ArrayList<>();
                    shareUris.add(shareUri);
    
            public static Uri getUriForFile(String authority, File file) {
            return Uri.parse("content://" + authority + "/" + file.getName());
        }
    

0 个答案:

没有答案