首页 > 其他分享 >Android 接收微信、QQ其他应用打开,第三方分享

Android 接收微信、QQ其他应用打开,第三方分享

时间:2022-11-07 17:35:51浏览次数:44  
标签:QQ return String 微信 uri intent context Android null

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

在AndroidManifest.xml注册ACTION事件

<activity
        android:name="com.test.app.MainActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="这里的名称会对外显示"
        android:launchMode="singleTask"
        android:screenOrientation="portrait">
        //注册接收分享
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />

            //接收分享的文件类型
            <data android:mimeType="image/*" />
            <data android:mimeType="application/msword" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
            <data android:mimeType="application/vnd.ms-excel" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
            <data android:mimeType="application/vnd.ms-powerpoint" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
            <data android:mimeType="application/pdf" />
            <data android:mimeType="text/plain" />
            </intent-filter>
            
        //注册默认打开事件,微信、QQ的其他应用打开
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            
            //接收打开的文件类型
            <data android:scheme="file" />
            <data android:scheme="content" />
            <data android:mimeType="image/*" />
            <data android:mimeType="application/msword" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
            <data android:mimeType="application/vnd.ms-excel" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
            <data android:mimeType="application/vnd.ms-powerpoint" />
            <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
            <data android:mimeType="application/pdf" />
            <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

在用于接收分享的Activity里面加接收代码

  1. 当APP进程在后台时,会调用Activity的onNewIntent方法
  2. 当APP进程被杀死时,会调用onCreate方法

所以在两个方法中都需要监听事件

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        receiveActionSend(intent);
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        receiveActionSend(intent);
    }

receiveActionSend方法如下

    public void receiveActionSend(Intent intent) {
        String action = intent.getAction();
        String type = intent.getType();

        //判断action事件
        if (type == null || (!Intent.ACTION_VIEW.equals(action) && !Intent.ACTION_SEND.equals(action))) {
            return;
        }
        
        //取出文件uri
        Uri uri = intent.getData();
        if (uri == null) {
            uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
        }
        
        //获取文件真实地址
        String filePath = UriUtils.getFileFromUri(EdusohoApp.baseApp, uri);
        if (TextUtils.isEmpty(filePath)) {
            return;
        }

        //业务处理
        .
        .
        .
    }

获取真实路径getFileFromUri方法

    /**
     * 获取真实路径
     *
     * @param context
     */
    public static String getFileFromUri(Context context, Uri uri) {
        if (uri == null) {
            return null;
        }
        switch (uri.getScheme()) {
            case ContentResolver.SCHEME_CONTENT:
                //Android7.0之后的uri content:// URI
                return getFilePathFromContentUri(context, uri);
            case ContentResolver.SCHEME_FILE:
            default:
                //Android7.0之前的uri file://
                return new File(uri.getPath()).getAbsolutePath();
        }
    }

Android7.0之后的uri content:// URI需要对微信、QQ等第三方APP做兼容

  • 在文件管理选择本应用打开时,url的值为content://media/external/file/85139
  • 在微信中选择本应用打开时,url的值为 content://com.tencent.mm.external.fileprovider/external/tencent/MicroMsg/Download/111.doc
  • 在QQ中选择本应用打开时,url的值为 content://com.tencent.mobileqq.fileprovider/external_files/storage/emulated/0/Tencent/QQfile_recv/

第一种为系统统一文件资源,能通过系统方法转化为绝对路径;
微信、QQ的为fileProvider,只能获取到文件流,需要先将文件copy到自己的私有目录。
方法如下:

    /**
     * 从uri获取path
     *
     * @param uri content://media/external/file/109009
     *            <p>
     *            FileProvider适配
     *            content://com.tencent.mobileqq.fileprovider/external_files/storage/emulated/0/Tencent/QQfile_recv/
     *            content://com.tencent.mm.external.fileprovider/external/tencent/MicroMsg/Download/
     */
    private static String getFilePathFromContentUri(Context context, Uri uri) {
        if (null == uri) return null;
        String data = null;

        String[] filePathColumn = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME};
        Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
        if (null != cursor) {
            if (cursor.moveToFirst()) {
                int index = cursor.getColumnIndex(MediaStore.MediaColumns.DATA);
                if (index > -1) {
                    data = cursor.getString(index);
                } else {
                    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
                    String fileName = cursor.getString(nameIndex);
                    data = getPathFromInputStreamUri(context, uri, fileName);
                }
            }
            cursor.close();
        }
        return data;
    }
    
    /**
     * 用流拷贝文件一份到自己APP私有目录下
     *
     * @param context
     * @param uri
     * @param fileName
     */
    private static String getPathFromInputStreamUri(Context context, Uri uri, String fileName) {
        InputStream inputStream = null;
        String filePath = null;

        if (uri.getAuthority() != null) {
            try {
                inputStream = context.getContentResolver().openInputStream(uri);
                File file = createTemporalFileFrom(context, inputStream, fileName);
                filePath = file.getPath();

            } catch (Exception e) {
            } finally {
                try {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                } catch (Exception e) {
                }
            }
        }

        return filePath;
    }

    private static File createTemporalFileFrom(Context context, InputStream inputStream, String fileName)
            throws IOException {
        File targetFile = null;

        if (inputStream != null) {
            int read;
            byte[] buffer = new byte[8 * 1024];
            //自己定义拷贝文件路径
            targetFile = new File(context.getExternalCacheDir(), fileName);
            if (targetFile.exists()) {
                targetFile.delete();
            }
            OutputStream outputStream = new FileOutputStream(targetFile);

            while ((read = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
            }
            outputStream.flush();

            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return targetFile;
    }

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:QQ,return,String,微信,uri,intent,context,Android,null
From: https://www.cnblogs.com/smileZAZ/p/16866720.html

相关文章

  • AI人脸检测/安全帽检测智能分析网关告警消息配置——微信告警消息配置
    AI智能分析网关内置多种深度学习算法,可支持对接入的多路视频流进行智能检测、智能识别等,包括人脸检测与识别、车辆检测与识别、车牌识别、烟火识别、安全帽识别、区域入侵检......
  • 微信小程序使用watch监听数据变化的方法
    众所周知,Vue中,可以使用监听属性watch来观察和响应Vue实例上的数据变化,那么小程序能不能实现这一点呢?监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一......
  • Android的Service作用和使用方法
    首先Service是干嘛的就是你Activity,finish之后你创建的Service还不会死,注意关闭软件这里是finish就是返回操作,不是清理后台,这时候你可以让用户干别的,你的软件依然可以......
  • uniapp引入微信小程序自定义视频组件--记录
    官方文档:https://zh.uniapp.dcloud.io/tutorial/miniprogram-subject.html在pages.json同级目录下创建目录和文件:wxcomponents:   my-video-play:index.js ......
  • uniapp小程序微信支付功能
    小程序支付https://blog.csdn.net/lwx931449660/article/details/122530586 uniapp小程序微信支付功能已于2022-09-2810:38:34修改字段说明前置工作获取......
  • android-创建无界面的服务运行在后台
    android-创建无界面的服务运行在后台RT,目标是新建一个服务运行在后台,但不能有界面具体步骤如下:1.新建一个无界面的Activity新建一个无界面的Activity,但是不给它s......
  • Android用户页面设计
    Android用户界面布局管理Android系统按照MVC(模型(model)——视图(view)——控制器(controller))设计模式将应用程序的界面设计与功能控制设计分离,类似于前......
  • android-Service_Intent_must_be_explicit的解决方法
    android:ServiceIntentmustbeexplicit的解决方法在使用AIDL隐式开启一个服务的时候,可能会遇到这个错误IllegalArgumentException:ServiceIntentmustbeexplici......
  • .NET Core 集成微信支付签名错误
    .NETCore集成微信支付签名错误Theprovideddataistaggedwith'Universal'classvalue'16',butitshouldhavebeen'Universal'classvalue'2'.The......
  • 微信 聊天记录转成文本
     一、进入你要导出聊天记录的对话框,选中你要导出的聊天记录,点击多选。或者,选择中已转发的微信聊天记录,如图: 点击收藏页面选中你要导出的聊天记录,页面底部选择收......