w***@163.com
w***@163.com
  • 发布:2021-03-16 00:03
  • 更新:2021-10-21 16:32
  • 阅读:1965

调用安卓系统分享功能,分享非媒体文件到微信

分类:Native.js

在我的 app 中需要分享 json 文件,看了好多文章大多数都是讲如何分享媒体文件的,比如图片音频什么的,其实调用系统分享功能也是比较简单的,但是分享到微信就会遇到找不到资源的问题,要使用 FileProvider 方式的话就必须要通过原生开发辅助才行,经过无数次的尝试发现微信要获取文件必须要 content:// 开头的 Uri 才行,最后使用了参考文档中的第二种方法 scanFile,目前只是为了达到目的所以代码比较粗糙,欢迎大佬指正

大概思路是这样的:

  1. 把要分享的文件从 app 私有目录复制到公共目录,这里选了 Download 目录
  2. 调用 MediaScannerConnection.scanFile 方法,在 onScanCompleted 回调函数中获取正确的 Uri 标识
  3. 再调用系统分享功能即可
// #ifdef APP-PLUS  
plus.android.importClass('android.content.ContentResolver')  

const MainActivity = plus.android.runtimeMainActivity(),  
    Intent = plus.android.importClass('android.content.Intent'),  
    Uri = plus.android.importClass('android.net.Uri'),  
    InputStreamReader = plus.android.importClass('java.io.InputStreamReader'),  
    OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter'),  
    BufferedReader = plus.android.importClass('java.io.BufferedReader'),  
    BufferedWriter = plus.android.importClass('java.io.BufferedWriter'),  
    File = plus.android.importClass('java.io.File'),  
    FileInputStream = plus.android.importClass('java.io.FileInputStream'),  
    FileOutputStream = plus.android.importClass('java.io.FileOutputStream'),  
    MediaScannerConnection = plus.android.importClass('android.media.MediaScannerConnection'),  
    Environment = plus.android.importClass('android.os.Environment'),  

    SETTINGS_FILENAME = 'settings.json'  
// #endif  

function share_file() {  
    // #ifndef APP-PLUS  
    return false  
    // #endif  

    // #ifdef APP-PLUS  
    plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => {  
        fs.root.getFile(SETTINGS_FILENAME, {}, file_entry => {  
            const listener = new plus.android.implements('android.media.MediaScannerConnection$OnScanCompletedListener', {  
                'onScanCompleted': (path, uri) => {  
                    console.log('uri: ' + uri.toString())  

                    const intent = new Intent()  
                        .setAction(Intent.ACTION_SEND)  
                        .setType('text/*')  
                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)  
                        .putExtra(Intent.EXTRA_TEXT, 'Share a file')  
                        .putExtra(Intent.EXTRA_STREAM, uri) // Uri.parse(file_entry.fullPath))  
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION)  

                    MainActivity.startActivity(Intent.createChooser(intent, 'Share a file'))  
                    // MainActivity.startActivity(intent)  
                    new File(path).deleteOnExit()  
                }  
            })  

            copy_file_to_public_directory(file_entry.fullPath)  
            MediaScannerConnection.scanFile(MainActivity, [get_public_directory() + '/' + SETTINGS_FILENAME], null, listener)  

            return true  
        }, error => {  
            uni.showToast({  
                title: '文件不存在',  
                icon: 'none',  
                duration: 2000  
            })  
        })  
    })  
    // #endif  
}  

function copy_file_to_public_directory(file_path) {  
    // #ifndef APP-PLUS  
    return false  
    // #endif  

    // #ifdef APP-PLUS  
    const input_stream = new FileInputStream(file_path),  
        output_Stream = new FileOutputStream(get_public_directory() + '/' + SETTINGS_FILENAME),  
        file_reader = new BufferedReader(new InputStreamReader(input_stream)),  
        file_writer = new BufferedWriter(new OutputStreamWriter(output_Stream)),  
        content = file_reader.readLine()  

    file_writer.write(content, 0, content.length)  
    file_writer.flush()  

    file_writer.close()  
    file_reader.close()  
    output_Stream.close()  
    input_stream.close()  
    console.log('copy file success')  

    return true  
    // #endif  
}  

function get_public_directory() {  
    // '/storage/emulated/0/Download/temp'  
    // #ifndef APP-PLUS  
    return false  
    // #endif  

    // #ifdef APP-PLUS  
    return new File(Environment.getExternalStorageDirectory(), 'Download/temp').getAbsolutePath()  
    // #endif  
}

参考文档:

1 关注 分享
MonikaCeng

要回复文章请先登录注册

1***@qq.com

1***@qq.com

请问这个可以分享PDF吗?
2021-10-21 16:32
4***@qq.com

4***@qq.com

请问一下,最新的编译器这个代码还能用吗?经测试发现startactivity弹不出来,要加void plus.runtime.openFile( filePath);以后才行,而且openfile的弹出会被顶掉,不影响
2021-08-25 23:49
w***@163.com

w***@163.com (作者)

回复 MonikaCeng :
把关键词提取出来,加上 android 关键字,搜索出来的内容转一下njs就好了,只不过需要多多测试,因为到处都是坑哈哈哈哈哈
2021-03-17 21:12
MonikaCeng

MonikaCeng

我之前一直想,如何调用系统播放器播放视频,应该有点类似这种分享的思路吧
2021-03-17 00:22
MonikaCeng

MonikaCeng

plus.android.importClass('android.content.ContentResolver')
这个需要第三方插件吗?
2021-03-17 00:21