Cp0204
Cp0204
  • 发布:2015-01-06 22:29
  • 更新:2024-03-27 16:54
  • 阅读:40436

通过native.js调用系统分享 - 示例

分类:Native.js

更新:目前plus.share已经实现了对系统分享的调用。已无必要使用Native.js调用系统分享。参考http://www.html5plus.org/doc/zh_cn/share.html#plus.share.sendWithSystem

============================================================================

先说明,我对原生只是有一点点了解。我的目的是教大家,希望大家也可以自己写native.js。
前几天我问为什么不集成 Intent.ACTION_SEND 分享,@DCloud_heavensoft 说官方刚好正在做。
今晚读了一下:
http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/114
http://www.dcloud.io/docs/api/zh_cn/android.shtml
对比了一下示例和网上找的原生代码,试着捣鼓,也捣鼓出来了。
二楼放代码,三楼放教程。


二楼不支持MD,那这里更新好了,直接拿去用就行了

function share(shareTip,shareText){  
var Context = plus.android.importClass("android.content.Intent");  
var Main = plus.android.runtimeMainActivity();  
var shareIntent=new Context(Context.ACTION_SEND);  
shareIntent.setType("text/plain");   
shareIntent.putExtra(Context.EXTRA_TEXT, shareText);  
Main.startActivity(Context.createChooser(shareIntent,shareTip));  
}  
//调用  
share('分享到...','要分享的文本');

带注释

function share(shareTip,shareText){  
    //导入Java类对象  
    var Context = plus.android.importClass("android.content.Intent");  
    //获取应用主Activity  
    var Main = plus.android.runtimeMainActivity();  
    //将类Context的这个行为(Action)ACTION_SEND,赋给shareIntent  
    var shareIntent=new Context(Context.ACTION_SEND);  
    //***以下两种写法是一样的  
    //plus.android.invoke(shareIntent,"setType","text/plain");  
    //plus.android.invoke(shareIntent,"putExtra",Context.EXTRA_TEXT,shareText);  
    //设置分享类型  
    shareIntent.setType("text/plain");   
    //设置分享文本  
    shareIntent.putExtra(Context.EXTRA_TEXT, shareText);  
    //***以上两种写法是一样的  
    //指定分享的包名  
    //shareIntent.setPackage('com.tencent.mm',);  
    Main.startActivity(Context.createChooser(shareIntent,shareTip));  
}

原生代码这样写,大家对比下,就发现不难懂,字符对应上

Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);  
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");  
sendIntent.setType("text/plain");  
startActivity(Intent.createChooser(sendIntent,'send to...'));
24 关注 分享
DCloud_UNI_CHB DCloud_heavensoft 凯哥 小闹 深井冰_01 多串君 h5_学习者 有毒葡萄 LHQ 梓宏 陈旭媛 蔡繁荣 鸿运当头 寻梦111 x***@sina.cn 雪之梦技术驿站 东方小浪哥 小新的狗叫小白 2***@qq.com 8***@qq.com 在职憨生 Roach sd791002 王伟锋

要回复文章请先登录注册

1***@qq.com

1***@qq.com

回复 优服科技 :
解决了吗
2024-03-27 16:54
1***@qq.com

1***@qq.com

回复 优服科技 :
解决了吗
2024-03-27 16:54
1***@qq.com

1***@qq.com

能分享xlsx文件吗
2024-03-27 16:10
老向

老向

更新:目前plus.share已经实现了对系统分享的调用。已无必要使用Native.js调用系统分享。参考http://www.html5plus.org/doc/zh_cn/share.html#plus.share.sendWithSystem

============================================================================

这个plus.share调出来分享,UI丑得吓死人。还有一些乱七八糟的东西也显示出来了,
把那个UI搞一下,把一些不必要的过虑一下。
大家也不用拼命调原生分享了。
2021-04-02 18:40
老向

老向

回复 w***@163.com :
在安卓上调用系统分享方式,只能分享图片和文字两个方式,优点是不用申请各种分享的开发接口,微信,微博,facebook,等全通杀,你那个分享图片不成功因为新一点的安卓系统禁止APP之间互访文件资料引起的!
你加上if()那段代码就可以了
2021-04-02 18:27
老向

老向

回复 w***@163.com :
function sys_share(){
var osver = parseInt(plus.os.version);
var Uri = plus.android.importClass("android.net.Uri");
var StrictMode = plus.android.importClass("android.os.StrictMode");
var Context = plus.android.importClass("android.content.Intent");
var Main = plus.android.runtimeMainActivity();
if(osver>=7){
var builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
var shareIntent=new Context(Context.ACTION_SEND);
//shareIntent.setType("text/plain");
//shareIntent.putExtra(Context.EXTRA_TEXT, sharefile);
var uri = Uri.parse("file://"+sd_path);
shareIntent.putExtra(Context.EXTRA_STREAM,uri);
shareIntent.setType("image/*");
Main.startActivity(Context.createChooser(shareIntent,"分享到"));
}

分享图片时,安卓7以后的系统,第三方程序不能读取调用者的APP的文件,需要授权才可以的!
if(osver>=7){
var builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
这段是重点,要不系统分享读取不到图片,
2021-04-02 18:21
w***@163.com

w***@163.com

回复 老向 :
麻烦问下,你是怎么看到报错信息的?我这边真机调试出错就是不继续执行代码,但是没有任何提示信息
2021-03-16 09:42
优服科技

优服科技

回复 DCloud_heavensoft :
share(shareTip, Path) {
console.log('PPOOOOOO')
let Context = plus.android.importClass("android.content.Intent");
let Main = plus.android.runtimeMainActivity();

let Uri = plus.android.importClass("android.net.Uri");
let File = plus.android.importClass("java.io.File");

let shareIntent = new Context(Context.ACTION_SEND);
let filePath = plus.io.convertLocalFileSystemURL(Path); //把应用内的文件路径转化为手机绝对路径
// console.warn(filePath)

console.log(JSON.stringify(new File(filePath)))
// console.log(JSON.stringify(Uri.fromFile(new File(filePath))))
shareIntent.putExtra(Context.EXTRA_STREAM, Uri.fromFile(new File(filePath)));
shareIntent.setType("*/*");
console.log(shareIntent)
Main.startActivity(Context.createChooser(shareIntent, shareTip));
},
fnExport() {

const that = this;
const downloadTask = uni.downloadFile({
url: 'http://www.gov.cn/zhengce/pdfFile/2020_PDF.pdf', //仅为示例,并非真实的资源
success: (res) => {
if (res.statusCode === 200) {
console.log('下载成功');
uni.saveFile({
tempFilePath: res.tempFilePath,
success: function(red) {
console.log(red)
console.log('保存成功')
console.log('任务完成,中断下载任务')
downloadTask.abort() //中断下载任务
that.share('分享到', res.tempFilePath);

}
});
}
}
});

一旦换成文件就不行 虽然文档只能说type是图片跟文本但是其他app系统的确可以分享文件的啊
2020-09-26 11:58
优服科技

优服科技

文件分享不行呢
2020-09-26 11:46
老向

老向

分享图片时,出现:exposed beyond app through ClipData.Item.getUri();
代码:
function sys_share(){
var Uri = plus.android.importClass("android.net.Uri");
var Context = plus.android.importClass("android.content.Intent");
var Main = plus.android.runtimeMainActivity();
var shareIntent=new Context(Context.ACTION_SEND);
//shareIntent.setType("text/plain");
shareIntent.setType("image/*");
console.log('file:/'+sd_path);
shareIntent.putExtra(Context.EXTRA_STREAM, Uri.parse('content://'+sd_path));
//shareIntent.putExtra(Context.EXTRA_STREAM, Uri.parse(hb_path));
Main.startActivity(Context.createChooser(shareIntent,"分享到"));
}
2020-09-17 20:07