HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

百度广告应用所有权验证教程

百度广告 所有权验证

申请百度广告后,开发者必须要空包签名验证应用的所有权,以下为Android和IOS的签名教程:

Android获取签名

说明

空包签名需要本地配置jdk环境

命令行方式

命令格式:

jarsigner -verbose -keystore [签名文件路径] -signedjar [签名后apk的文件路径] [未签名apk的文件路径] [证书别名]  

参数说明

  • -verbose 签名时输出详细信息,便于您查看签名结果

  • -keystore 指定签名文件的存放路径

  • -signedjar 指定签名后的apk文件的存放路径

  • [未签名apk的文件路径] 指定从百度联盟平台下载的需要您签名的apk文件的存放路径

  • [证书别名] 指定签名时使用的证书。请注意,必须与发布应用时使用的证书相同

  • Linux或Mac平台。

    • 打开 Terminal 程序
    • 切换到下载的未签名apk空包的存放目录
    • 在当前目录下执行命令完成签名

命令示例:jarsigner -verbose -keystore ~/Workspace/myKeystore.jks -signedjar ./mssp-verify-signed.apk ./mssp-verify.apk myKey

  • Windows平台。
    • 打开 命令提示符 程序
    • 切换到下载的未签名apk空包的存放目录
    • 在当前目录下执行命令完成签名

命令示例:jarsigner -verbose -keystore C:\Documents\myKeystore.jks -signedjar mssp-verify-signed.apk mssp-verify.apk myKey

HBuilder X 插件方式

插件地址:Android Apk包签名

打开上述插件地址,点击左侧“使用 HBuilderX 导入插件”,导入插件到HBuilder X中

点击HBuilder X顶部菜单【工具】,点击【Android Apk包签名】,按照说明填写即可。

IOS获取签名

  1. 进入苹果开发者主页(https://developer.apple.com)
  2. 点击菜单栏的 Account 按钮,输入开发者账号登录
  3. 进入 Certificates, Identifiers & Profiles
  4. 从左侧导航中选择 Provisioning Profiles - Distribution
  5. 在右侧选择需要认证的APP,点击APP名称展开,并点击下载即可获得一个 .mobileprovision 文件
继续阅读 »

申请百度广告后,开发者必须要空包签名验证应用的所有权,以下为Android和IOS的签名教程:

Android获取签名

说明

空包签名需要本地配置jdk环境

命令行方式

命令格式:

jarsigner -verbose -keystore [签名文件路径] -signedjar [签名后apk的文件路径] [未签名apk的文件路径] [证书别名]  

参数说明

  • -verbose 签名时输出详细信息,便于您查看签名结果

  • -keystore 指定签名文件的存放路径

  • -signedjar 指定签名后的apk文件的存放路径

  • [未签名apk的文件路径] 指定从百度联盟平台下载的需要您签名的apk文件的存放路径

  • [证书别名] 指定签名时使用的证书。请注意,必须与发布应用时使用的证书相同

  • Linux或Mac平台。

    • 打开 Terminal 程序
    • 切换到下载的未签名apk空包的存放目录
    • 在当前目录下执行命令完成签名

命令示例:jarsigner -verbose -keystore ~/Workspace/myKeystore.jks -signedjar ./mssp-verify-signed.apk ./mssp-verify.apk myKey

  • Windows平台。
    • 打开 命令提示符 程序
    • 切换到下载的未签名apk空包的存放目录
    • 在当前目录下执行命令完成签名

命令示例:jarsigner -verbose -keystore C:\Documents\myKeystore.jks -signedjar mssp-verify-signed.apk mssp-verify.apk myKey

HBuilder X 插件方式

插件地址:Android Apk包签名

打开上述插件地址,点击左侧“使用 HBuilderX 导入插件”,导入插件到HBuilder X中

点击HBuilder X顶部菜单【工具】,点击【Android Apk包签名】,按照说明填写即可。

IOS获取签名

  1. 进入苹果开发者主页(https://developer.apple.com)
  2. 点击菜单栏的 Account 按钮,输入开发者账号登录
  3. 进入 Certificates, Identifiers & Profiles
  4. 从左侧导航中选择 Provisioning Profiles - Distribution
  5. 在右侧选择需要认证的APP,点击APP名称展开,并点击下载即可获得一个 .mobileprovision 文件
收起阅读 »

无线adb调试(无offline问题)

无线调试 adb
  • 手机开启"USB调试" 和 "仅充电"允许ADB调试 并 与电脑是局域网(有公网当我没说);
  • \HBuilderX.3.3.5.20211229.full\HBuilderX\plugins\launcher\tools\adbs 目录下打开cmd;

cmd执行 :

  • "adb connect 手机IP地址" (失败往下看)
  • "adb tcpip 设置端口" (需要usb连接调试)
  • "adb connect 手机IP地址"
  • "adb devices" (查看连接)
继续阅读 »
  • 手机开启"USB调试" 和 "仅充电"允许ADB调试 并 与电脑是局域网(有公网当我没说);
  • \HBuilderX.3.3.5.20211229.full\HBuilderX\plugins\launcher\tools\adbs 目录下打开cmd;

cmd执行 :

  • "adb connect 手机IP地址" (失败往下看)
  • "adb tcpip 设置端口" (需要usb连接调试)
  • "adb connect 手机IP地址"
  • "adb devices" (查看连接)
收起阅读 »

在某些场景下overflow: auto, scorll失效问题

uniapp

问题: 封装的Select组件写在uni-app的Popup里会失效的问题
解决: 这是因为Popup里禁止了事件冒泡, Popup在源码取消阻止事件冒泡

问题: 封装的Select组件写在uni-app的Popup里会失效的问题
解决: 这是因为Popup里禁止了事件冒泡, Popup在源码取消阻止事件冒泡

个推消息推送SDK如何与第三方账号打通,实现精细化推送?

个推 个推SDK 消息推送

APP在运营过程中,都拥有属于自己的账号体系,且账号运营体系不尽相同。例如社交类APP的账号体系有社交ID号、自定义昵称、邮箱等等。APP基于账号体系场景下进行消息精细化推送,例如银行类APP账户余额变动、订单状态更新等,需要与账号体系进行打通、绑定、识别,从而实现目标用户消息推送。

因此,为了满足客户精细化推送需求,个推消息推送推出别名推送功能,可快速打破不同账号体系下的信息屏障,通过个推CID与APP的账号体系进行绑定,实现目标用户精细化推送,以满足某些场景下的特定推送需求。

名词解释

  • CID:个推业务层中的对外用户标识,用于标识客户端身份,由第三方客户端获取并保存到第三方服务端,是个推 SDK 的唯一识别号,简称 CID。
  • 别名:是 APP 为用户定义的标识,可用于用户账号与个推 CID 关联,建议将邮箱、昵称等用户标识设为别名。为用户绑定别名后,可以通过别名圈选目标用户进行推送。

技术实现方案

1.前置准备
完成 Android 集成指南 和 iOS 集成指南 。

2.设置别名
开发者可在客户端或者服务端给 CID 设置别名,客户端需要区分Android 和 iOS,服务端无需区分,开发者选择其中一个渠道(客户端或服务端)设置即可。

  • Android 客户端:在成功获取 CID 的回调方法 onReceiveClientId 内,调用 绑定别名接口 将 APP 的用户标识设置为 CID 的别名。
  • iOS 客户端:在成功获取 CID 的回调方法 GeTuiSdkDidRegisterClient 内,调用 绑定别名接口 将 APP 的用户标识设置为 CID 的别名。

2.1客户端设置别名
开发者需要自己存储 CID,在系统新增 CID 时,调用绑定别名接口将APP 的用户标识设置为 CID 的别名。

2.2 服务端设置别名
1、登录个推开发者中心,点击个推消息推送-选择应用-配置管理-别名管理
2、绑定用户【别名】
①点击【添加别名】:输入别名和CID即可绑定别名用户。
 

 
②批量添加别名:首先创建一个别名和对应CID的TXT文本,然后点击【批量导入】上传别名列表文本,最后点击【导入】即可批量添加别名以及对应的CID用户。

注意事项:
重复绑定别名以最后一次为准,同一个CID 绑定接口调用的间隔需大于 1s,客户端单个设备每天限制调用 100 次。
一个 CID 只支持绑定一个别名,一个别名至多绑定 10 个CID 。

3.服务端推送
开发者可通过调用个推服务端API 或者直接从个推开发者中心页面推送消息。
3.1 服务端API 推送
使用别名单推接口,在给每个别名用户推送的内容都不同的情况下,可以批量或单个给指定别名用户推送消息。适用于银行类APP群发工资时的银行卡动账提醒、单个用户转账的银行卡动账提醒等场景。具体操作见下说明文档:
1、别名单推接口使用说明文档
2、别名批量单推使用说明文档

3.2 开发者中心推送
1、别名推送:别名绑定成功后,点击创建通知/透传消息-目标选择,选择【别名用户】进行消息推送。例如绑定别名用户为【测试】,输入【测试】即可圈选测试别名下的所有用户进行推送。

 
2、根据推送页面说明填写好其他配置信息,查看推送预览,确认无误后,点击【确定】,正式发送推送。

总结

企业在多业务线运营过程中,别名推送还能够帮助拥有多个应用的企业打通多应用账号体系,解决应用之间账户信息不同步的问题,方便运营进行统一推送与管理,极大减少运营成本,提升用户服务效率。
如果您对别名推送感兴趣,可以扫码添加@个推技术支持 立即咨询。

继续阅读 »

APP在运营过程中,都拥有属于自己的账号体系,且账号运营体系不尽相同。例如社交类APP的账号体系有社交ID号、自定义昵称、邮箱等等。APP基于账号体系场景下进行消息精细化推送,例如银行类APP账户余额变动、订单状态更新等,需要与账号体系进行打通、绑定、识别,从而实现目标用户消息推送。

因此,为了满足客户精细化推送需求,个推消息推送推出别名推送功能,可快速打破不同账号体系下的信息屏障,通过个推CID与APP的账号体系进行绑定,实现目标用户精细化推送,以满足某些场景下的特定推送需求。

名词解释

  • CID:个推业务层中的对外用户标识,用于标识客户端身份,由第三方客户端获取并保存到第三方服务端,是个推 SDK 的唯一识别号,简称 CID。
  • 别名:是 APP 为用户定义的标识,可用于用户账号与个推 CID 关联,建议将邮箱、昵称等用户标识设为别名。为用户绑定别名后,可以通过别名圈选目标用户进行推送。

技术实现方案

1.前置准备
完成 Android 集成指南 和 iOS 集成指南 。

2.设置别名
开发者可在客户端或者服务端给 CID 设置别名,客户端需要区分Android 和 iOS,服务端无需区分,开发者选择其中一个渠道(客户端或服务端)设置即可。

  • Android 客户端:在成功获取 CID 的回调方法 onReceiveClientId 内,调用 绑定别名接口 将 APP 的用户标识设置为 CID 的别名。
  • iOS 客户端:在成功获取 CID 的回调方法 GeTuiSdkDidRegisterClient 内,调用 绑定别名接口 将 APP 的用户标识设置为 CID 的别名。

2.1客户端设置别名
开发者需要自己存储 CID,在系统新增 CID 时,调用绑定别名接口将APP 的用户标识设置为 CID 的别名。

2.2 服务端设置别名
1、登录个推开发者中心,点击个推消息推送-选择应用-配置管理-别名管理
2、绑定用户【别名】
①点击【添加别名】:输入别名和CID即可绑定别名用户。
 

 
②批量添加别名:首先创建一个别名和对应CID的TXT文本,然后点击【批量导入】上传别名列表文本,最后点击【导入】即可批量添加别名以及对应的CID用户。

注意事项:
重复绑定别名以最后一次为准,同一个CID 绑定接口调用的间隔需大于 1s,客户端单个设备每天限制调用 100 次。
一个 CID 只支持绑定一个别名,一个别名至多绑定 10 个CID 。

3.服务端推送
开发者可通过调用个推服务端API 或者直接从个推开发者中心页面推送消息。
3.1 服务端API 推送
使用别名单推接口,在给每个别名用户推送的内容都不同的情况下,可以批量或单个给指定别名用户推送消息。适用于银行类APP群发工资时的银行卡动账提醒、单个用户转账的银行卡动账提醒等场景。具体操作见下说明文档:
1、别名单推接口使用说明文档
2、别名批量单推使用说明文档

3.2 开发者中心推送
1、别名推送:别名绑定成功后,点击创建通知/透传消息-目标选择,选择【别名用户】进行消息推送。例如绑定别名用户为【测试】,输入【测试】即可圈选测试别名下的所有用户进行推送。

 
2、根据推送页面说明填写好其他配置信息,查看推送预览,确认无误后,点击【确定】,正式发送推送。

总结

企业在多业务线运营过程中,别名推送还能够帮助拥有多个应用的企业打通多应用账号体系,解决应用之间账户信息不同步的问题,方便运营进行统一推送与管理,极大减少运营成本,提升用户服务效率。
如果您对别名推送感兴趣,可以扫码添加@个推技术支持 立即咨询。

收起阅读 »

小程序跳转至小程序失败

页面跳转

uni.navigateToMiniProgram({
appId:'UNI4138A06',
path:'',
success(res) {
testModule.showToast(res.toString());
}
})

无法跳转至对应小程序,这个小程序也是uniapp的

继续阅读 »

uni.navigateToMiniProgram({
appId:'UNI4138A06',
path:'',
success(res) {
testModule.showToast(res.toString());
}
})

无法跳转至对应小程序,这个小程序也是uniapp的

收起阅读 »

应用内打开某个AppStore应用详情、应用内直接跳转到appstore、应用内嵌入AppStore(ios)

应用内打开某个AppStore应用详情、应用内直接跳转到appstore、应用内嵌入AppStore(ios):https://ext.dcloud.net.cn/plugin?id=767

继续阅读 »

应用内打开某个AppStore应用详情、应用内直接跳转到appstore、应用内嵌入AppStore(ios):https://ext.dcloud.net.cn/plugin?id=767

收起阅读 »

【百度广告】【空包签名】小小小心得

申请百度广告小小小心得

应用市场下载地址

【不确定】下载地址需要填写PC端网页版的比如应用宝:https://webcdn.m.qq.com/webapp/homepage/index.html#/appDetail?apkName=**
注意是:https://webcdn.m.qq.com/

空包签名验证

百度广告需做空包签名验证,前期请开发者线下与uniAD的相关联系人进行对接。

如何空包签名验证

uniAD的相关联系人会发一个空包(kongbao.apk),然后对其用命令签名

Windows命令完成签名

  1. 打开 命令提示符 程序 (快捷键: win + R 输入 cmd 回车)
  2. 切换到下载的未签名apk空包的存放目录
  3. 在当前目录下执行命令完成签名
  4. 命令示例:  
    jarsigner -verbose -keystore C:\Documents\myKeystore.jks -signedjar kongbao.apk.apk 自己应用已签名的.apk 别名

Mac命令完成签名没试过

。。。

空包签名完成发送给uniAD的相关联系人,等待审核即可

这事当然要记录呀,又不是每天都能碰上

1、命令里有个【mykey】不知道是【别名】。
2、命令里要放两个apk,不知道顺序哪个前哪个后。

继续阅读 »

申请百度广告小小小心得

应用市场下载地址

【不确定】下载地址需要填写PC端网页版的比如应用宝:https://webcdn.m.qq.com/webapp/homepage/index.html#/appDetail?apkName=**
注意是:https://webcdn.m.qq.com/

空包签名验证

百度广告需做空包签名验证,前期请开发者线下与uniAD的相关联系人进行对接。

如何空包签名验证

uniAD的相关联系人会发一个空包(kongbao.apk),然后对其用命令签名

Windows命令完成签名

  1. 打开 命令提示符 程序 (快捷键: win + R 输入 cmd 回车)
  2. 切换到下载的未签名apk空包的存放目录
  3. 在当前目录下执行命令完成签名
  4. 命令示例:  
    jarsigner -verbose -keystore C:\Documents\myKeystore.jks -signedjar kongbao.apk.apk 自己应用已签名的.apk 别名

Mac命令完成签名没试过

。。。

空包签名完成发送给uniAD的相关联系人,等待审核即可

这事当然要记录呀,又不是每天都能碰上

1、命令里有个【mykey】不知道是【别名】。
2、命令里要放两个apk,不知道顺序哪个前哪个后。

收起阅读 »

Android原生打包能够显示但是离线打包白屏可能-1

真机运行

查看你的Android设备的Cpu架构。某些设备是Intel的芯片的时候请添加x86的架构体系打包。

查看你的Android设备的Cpu架构。某些设备是Intel的芯片的时候请添加x86的架构体系打包。

提示内容为“打包时未添加XXX模块,请参考http://ask.dcloud.net.cn/article/283”

真机运行

我的工程的情况是: assets文件夹下data文件夹和framework的资源放进去。

我的工程的情况是: assets文件夹下data文件夹和framework的资源放进去。

更新后alt+鼠标左键,点击方法名跳不到定义处,选中项目点右键-重新构建项目索引,就可以了~赞

HBuilder HBuilderX

记录一下:
alt+鼠标左键,点击方法名跳不到定义处
解决办法:选中项目点右键-重新构建项目索引,就可以了~赞

参考:https://ask.dcloud.net.cn/article/5

记录一下:
alt+鼠标左键,点击方法名跳不到定义处
解决办法:选中项目点右键-重新构建项目索引,就可以了~赞

参考:https://ask.dcloud.net.cn/article/5

安卓uni.previewImage预览file://本地图片失败,一直转圈

uni_app

背景

自己开发的安卓原生插件,会返回安卓绝对路径形式的图片,如:file:///data/user/0/com.sample.test/cache/20220316.jpg
这是在应用的cache目录下直接写入的图片。
返回到uniapp端后,在template中通过<image>组件能正常显示图片。但通过uni.previewImage预览图片的话会一直转圈:


参数为:

{  
    "current": 0,  
    "urls": ["file:///data/user/0/com.sample.test/cache/20220316.jpg",  
        "file:///data/user/0/com.sample.test/cache/20220316_2.jpg",  
    ]  
}

接口返回:{"errMsg":"previewImage:ok"},没有错误。

解决方法

uni.previewImage只支持预览uniapp沙盒目录下的文件,即 只支持下面的目录和子目录下的图片预览:

  • PRIVATE_WWW 对应相对路径URL为"_www"开头的地址
  • PRIVATE_DOC 对应相对路径URL为"_doc"开头的地址
  • PUBLIC_DOCUMENTS 对应相对路径URL为"_documents"开头的地址
  • PUBLIC_DOWNLOADS 对应相对路径URL为"_downloads"开头的地址

所以原生插件生成图片时,将图片写入上面任意一个目录下即可。
以“_doc”为例,获取绝对路径可通过下面方式:

File parentDir = new File(mUniSDKInstance.rewriteUri(Uri.parse("_doc/"), URIAdapter.FILE).getPath());  

成功!

完整代码

原生安卓端
注意需要在app/src/main/assets/dcloud_uniplugins.json文件中注册原生插件。

import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.net.Uri;  
import com.alibaba.fastjson.JSONObject;  
import com.taobao.weex.adapter.URIAdapter;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.util.HashMap;  

import io.dcloud.feature.uniapp.annotation.UniJSMethod;  
import io.dcloud.feature.uniapp.bridge.UniJSCallback;  
import io.dcloud.feature.uniapp.common.UniModule;  

public class MyImgUni extends UniModule {  

    @UniJSMethod(uiThread = false)  
    public void getNativeImg(JSONObject opts, UniJSCallback callback) {  
        if (callback == null) return;  
        if (opts == null) {  
            callback.invoke(new HashMap<String, String>() {{  
                put("error", "`opts` required!");  
            }});  
            return;  
        }  
        try {  
            String imgPath = opts.getString("path");  
            if(imgPath.startsWith("_")){  
                // 将沙盒路径转为uri路径  
                imgPath = mUniSDKInstance.rewriteUri(Uri.parse(imgPath), URIAdapter.FILE).toString();  
            }  
            // 转为绝对路径  
            imgPath = imgPath.replace("file://", "");  
            Bitmap bitmap = BitmapFactory.decodeFile(imgPath);  

            // 对图片进行处理  
            Bitmap outImg = bitmap.copy(Bitmap.Config.ARGB_8888, true);  
            Canvas canvas = new Canvas(outImg);  
            canvas.drawColor(Color.argb(170, 255, 0, 0));  

            // 【重点】获得输出目录(这里需要时沙盒目录,否则无法使用uni.previewImage预览)  
            File parentDir = new File(mUniSDKInstance.rewriteUri(Uri.parse("_doc/"), URIAdapter.FILE).getPath());  
            // 创建输出图片  
            File outFile = new File(parentDir, "newImg.jpg");  
            try (FileOutputStream outputStream = new FileOutputStream(outFile)) {  
                outImg.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);  
            }  
            callback.invoke(new HashMap<String, String>() {{  
                put("resPath", "file://" + outFile.getAbsolutePath());  
            }});  
        } catch (Exception e) {  
            callback.invoke(new HashMap<String, String>() {{  
                put("error", e.toString());  
            }});  
        }  
    }  
}  

uniapp端调用(使用static目录下的一个图片测试)

                const handler = uni.requireNativePlugin('img-handle');  
                const ntvData = {path: '_www/static/inner/office_green_sm.png'};  
                handler.getNativeImg(ntvData, ({error, resPath}) => {  
                    if(error){  
                        console.error('handle img error:', error);  
                        return;  
                    }  
                    uni.previewImage({  
                        current: 0,  
                        urls:[resPath]  
                    })  
                });
继续阅读 »

背景

自己开发的安卓原生插件,会返回安卓绝对路径形式的图片,如:file:///data/user/0/com.sample.test/cache/20220316.jpg
这是在应用的cache目录下直接写入的图片。
返回到uniapp端后,在template中通过<image>组件能正常显示图片。但通过uni.previewImage预览图片的话会一直转圈:


参数为:

{  
    "current": 0,  
    "urls": ["file:///data/user/0/com.sample.test/cache/20220316.jpg",  
        "file:///data/user/0/com.sample.test/cache/20220316_2.jpg",  
    ]  
}

接口返回:{"errMsg":"previewImage:ok"},没有错误。

解决方法

uni.previewImage只支持预览uniapp沙盒目录下的文件,即 只支持下面的目录和子目录下的图片预览:

  • PRIVATE_WWW 对应相对路径URL为"_www"开头的地址
  • PRIVATE_DOC 对应相对路径URL为"_doc"开头的地址
  • PUBLIC_DOCUMENTS 对应相对路径URL为"_documents"开头的地址
  • PUBLIC_DOWNLOADS 对应相对路径URL为"_downloads"开头的地址

所以原生插件生成图片时,将图片写入上面任意一个目录下即可。
以“_doc”为例,获取绝对路径可通过下面方式:

File parentDir = new File(mUniSDKInstance.rewriteUri(Uri.parse("_doc/"), URIAdapter.FILE).getPath());  

成功!

完整代码

原生安卓端
注意需要在app/src/main/assets/dcloud_uniplugins.json文件中注册原生插件。

import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.net.Uri;  
import com.alibaba.fastjson.JSONObject;  
import com.taobao.weex.adapter.URIAdapter;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.util.HashMap;  

import io.dcloud.feature.uniapp.annotation.UniJSMethod;  
import io.dcloud.feature.uniapp.bridge.UniJSCallback;  
import io.dcloud.feature.uniapp.common.UniModule;  

public class MyImgUni extends UniModule {  

    @UniJSMethod(uiThread = false)  
    public void getNativeImg(JSONObject opts, UniJSCallback callback) {  
        if (callback == null) return;  
        if (opts == null) {  
            callback.invoke(new HashMap<String, String>() {{  
                put("error", "`opts` required!");  
            }});  
            return;  
        }  
        try {  
            String imgPath = opts.getString("path");  
            if(imgPath.startsWith("_")){  
                // 将沙盒路径转为uri路径  
                imgPath = mUniSDKInstance.rewriteUri(Uri.parse(imgPath), URIAdapter.FILE).toString();  
            }  
            // 转为绝对路径  
            imgPath = imgPath.replace("file://", "");  
            Bitmap bitmap = BitmapFactory.decodeFile(imgPath);  

            // 对图片进行处理  
            Bitmap outImg = bitmap.copy(Bitmap.Config.ARGB_8888, true);  
            Canvas canvas = new Canvas(outImg);  
            canvas.drawColor(Color.argb(170, 255, 0, 0));  

            // 【重点】获得输出目录(这里需要时沙盒目录,否则无法使用uni.previewImage预览)  
            File parentDir = new File(mUniSDKInstance.rewriteUri(Uri.parse("_doc/"), URIAdapter.FILE).getPath());  
            // 创建输出图片  
            File outFile = new File(parentDir, "newImg.jpg");  
            try (FileOutputStream outputStream = new FileOutputStream(outFile)) {  
                outImg.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);  
            }  
            callback.invoke(new HashMap<String, String>() {{  
                put("resPath", "file://" + outFile.getAbsolutePath());  
            }});  
        } catch (Exception e) {  
            callback.invoke(new HashMap<String, String>() {{  
                put("error", e.toString());  
            }});  
        }  
    }  
}  

uniapp端调用(使用static目录下的一个图片测试)

                const handler = uni.requireNativePlugin('img-handle');  
                const ntvData = {path: '_www/static/inner/office_green_sm.png'};  
                handler.getNativeImg(ntvData, ({error, resPath}) => {  
                    if(error){  
                        console.error('handle img error:', error);  
                        return;  
                    }  
                    uni.previewImage({  
                        current: 0,  
                        urls:[resPath]  
                    })  
                });
收起阅读 »