Skip to content

钩子专属

  • 首页
  • 安卓技术
  • 安卓教程

Category 安卓技术

  • 首页   /  
  • 分类归档: "安卓技术"
  • ( 页面5 )
安卓技术 6 月 21,2023

融云设置已读,未读消息标识

融云设置已读,未读消息标识

需求:会话列表,以及会话界面发出去的消息前面加上已读,未读的标识

官方给的解决方案

1、您可以通过 rc_config.xml 里的开关,开启消息的阅读回执功能。默认 false 为关闭状态,设置成 true 为开启
2、请在 init 之后调用下面方法来设置支持消息回执的会话类型。目前只支持 PRIVATE、GROUP 和 DISCUSSION 三种类型
官方还有一个说的更详细的文档,忘了在哪里,找不到了

官方的没法解决我的需求,就算它能显示也不是我想要的。

处理会话界面

1、自定义类继承自 MessageListAdpater, 然后重写其中的 holder.sentStatus

2、布局是 rc_item_message.xml

3、自定义类集成自 ConversationFragment,然后重写onResolveAdpater 中得到自定义adpter并返回
参考代码

public class MyMessageListAdapter extends MessageListAdapter {
public MyMessageListAdapter(Context context) {
    super(context);
}

@Override
protected void bindView(View v, int position, UIMessage data) {
    super.bindView(v, position, data);
    if(data != null){
        final MessageListAdapter.ViewHolder holder = (MessageListAdapter.ViewHolder) v.getTag();
        if(holder != null){
            if (data.getMessageDirection().equals(Message.MessageDirection.RECEIVE)) {
                holder.sentStatus.setVisibility(View.GONE);
            } else {
                LogUtils.i("msgStatus", data.getSentStatus().getValue() + "");
                if (data.getSentStatus() == Message.SentStatus.SENT) {
                    holder.sentStatus.setCompoundDrawablesWithIntrinsicBounds(v.getContext().getResources().getDrawable(R.mipmap.ic_msg_sent),null,null,null);
                    holder.sentStatus.setText(R.string.im_msg_sent);
                    holder.sentStatus.setVisibility(View.VISIBLE);
                } else if (data.getSentStatus() == Message.SentStatus.READ) {
                    holder.sentStatus.setText(R.string.im_msg_read);
                    holder.sentStatus.setCompoundDrawablesWithIntrinsicBounds(v.getContext().getResources().getDrawable(R.mipmap.ic_msg_read),null,null,null);
                    holder.sentStatus.setVisibility(View.VISIBLE);

                }
            }
        }

    }


}}

敲黑板:rc_config.xml 里的开关,开启消息的阅读回执功能。默认 false 为关闭状态,设置成 true 为开启 ,如果能正常显示最好,不能正常显示,需要在会话界面自己发送阅读回执。

处理会话列表界面

集成 PrivateConversationProvider 然后重新 bindView 方法, 然后在此方法中 根据 Message.SentStatus来进行修改显示内容
参考代码:

@ConversationProviderTag(
conversationType = "private",
portraitPosition = 1
)
public class MyPrivateConversationProvider extends PrivateConversationProvider {

@Override
public void bindView(View view, int position, UIConversation data) {
    super.bindView(view, position, data);
    PrivateConversationProvider.ViewHolder holder = (PrivateConversationProvider.ViewHolder)view.getTag();

        if(null != data && data.getConversationSenderId() != null && data.getConversationSenderId().equals(RongIM.getInstance().getCurrentUserId())){
            if(data.getSentStatus() != null){
                if(data.getSentStatus() == Message.SentStatus.FAILED || data.getSentStatus() == Message.SentStatus.SENDING){
                    holder.readStatus.setVisibility(View.GONE);
                } else {
                    if(data.getSentStatus() == Message.SentStatus.SENT){
                        holder.readStatus.setImageResource(R.mipmap.ic_msg_sent);
                        holder.readStatus.setVisibility(View.VISIBLE);
                    } else if(data.getSentStatus() == Message.SentStatus.READ){
                        holder.readStatus.setImageResource(R.mipmap.ic_msg_read);
                        holder.readStatus.setVisibility(View.VISIBLE);
                    }
                }
            }

        }

}}

提供下我问的工单
https://developer.rongcloud.cn/ticket/info/eB25GrlyC8EwlcdG1kY=
有问题请加Q群:142739277

作者 oshook
安卓技术 6 月 21,2023

百度云身份证识别,相机预览黑屏

百度云技术客服我是无语了,没有提供任何有用的信息。一直强调demo没问题,就没问题。
看下android:hardwareAccelerated=”false”是不是设为false了。
改为true就可以了。

作者 oshook
安卓技术 6 月 21,2023

file.mkdir()与file.mkdirs() 区别

总结:
file.mkdir() 如果你想在已经存在的文件夹下建立新的文件夹,就可以用此方法。此方法不能在不存在的文件夹下建立新的文件夹。假如想建立名字是”2019-03-16”文件夹,那么它的父文件夹必须存在。

file.mkdirs() 如果你想根据File里的路径名建立文件夹(当你不知道此文件夹是否存在,也不知道父文件夹存在),就可用此方法,它建立文件夹的原则是:如果父文件夹不存在并且最后一级子文件夹不存在,它就自动新建所有路经里写的文件夹;如果父文件夹存在,它就直接在已经存在的父文件夹下新建子文件夹

作者 oshook
安卓技术 6 月 21,2023

AndroidManifest用build中的变量值

build.gradle配置

示例:

defaultConfig {
    applicationId rootProject.ext.applicationId
    
    manifestPlaceholders = [ UMENG_CHANNEL_VALUE: "1",APPLICATIONID:applicationId]

}

AndroidMainfest.xml使用

示例:




用就不一定是value=。其他也可以用,当个变量用,变量在实际特定运行就会成特定的值

作者 oshook
安卓技术 6 月 21,2023

Flutter安装步骤

一、配置下载SDK环境变量

export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

百度说为了不翻墙的情况下下载快

如图

image

二、下载flutter SDK

用git bash工具进到存放sdk的文件夹中,然后输命令
git clone https://github.com/flutter/flutter.git

三、再配置sdk环境变量

看图,记得改为自己的路径

image

四、打开cmd命令窗口下载些依赖

进入flutter安装目录或者Flutter安装目录的flutter文件下找到flutter_console.bat,双击运行并启动flutter命令行后输入:flutter doctor
如发生错误:Error: Unable to find git in your PATH
解决方案:
在系统的环境变量Path中增加(注意找到你的git的相应目录):

  1. C:Program Files (x86)Gitbin
  2. C:Program Files (x86)Gitmingw64libexecgit-core
    否则等待完成。。
    正常会报错:
    1:Some Android licenses not accepted. To resolve this, run: flutter doctor –android-licens
    解决方案:flutter doctor –android-licenses 记得一路Yes
    2错:

    image

这个不用管,在android studio中搜索flutter插件安装即可

问题1:运行时如果发现找不到No connected devices found; please connect a device, or see flutter.io/setup for getting started instructions
解决方案:输入命令flutter doctor
是不是出现
[✗] Android toolchain – develop for Android devices
✗ Unable to locate Android SDK.
Install Android Studio from: https://developer.android.com/studio/index.html
On first launch it will assist you in installing the Android SDK components.
(or visit https://flutter.io/setup/#android-setup for detailed instructions).
If Android SDK has been installed to a custom location, set $ANDROID_HOME to that location

解决方法:在环境变量中新增ANDROID_HOME变量,变量值是你Android sdk的路径
如下图:

asc.png

添加完变量后,最好重启下电脑

问题2:Could not find io.flutter:flutter_embedding_debug
这个好坑,一直运行不到手机。它是报下载失败,各种改配置,换网络环境都不可以。
我猜是Android studio升级的问题的,原来是3.4配的flutter,在3.5就有问题了。
解决方法:删掉flutter重新下载就是重复上面步骤2

每次更新Android Studio版本

1、先升级AS里面的plugin的flutter,dart版本
2、删除之前下载在sdk中的flutter,重新本文开始的flutter安装

正常这样安装就可以了。有问题可评论回复

作者 oshook
安卓技术 6 月 21,2023

融云昵称错乱问题(异步请求问题)

请求接口要注意异步同步问题(融云昵称错乱问题)

应用场景:

一般发生在快速多次请求接口上,有可能接口还没返回,这时候你请求了下一次了,这样变量的值变了,但是前一个请求返回中有需要用到。这时就会出现错乱。

直接看代码

public class UserInfoPresenter {


private String to_account;


public void getIMUserInfo(String to_account){
    this.to_account = to_account;
    HashMap map = new HashMap();
    map.put("to_account",to_account);

    HttpUtils.noCacheRequest(MyApplication.getContext(), Contacts.RC_IM_USER_INFO, map, callBack, IMUserInfoResult.class);

}

/**
 * desc:token回调
 * create by cong on 2018/4/27 9:56
 *
 */
private ResponseCallBack callBack = new ResponseCallBack() {
    @Override
    public void onError(int code, Throwable e) {
        e.printStackTrace();

    }

    @Override
    public void onCache(IMUserInfoResult cache) {

    }

    @Override
    public void onResponse(IMUserInfoResult obj) {
        if (obj.getCode() == ResultCodes.GET_IM_USER_INFO_SUCCESS) {
            
            RongIM.getInstance().refreshUserInfoCache(new UserInfo(to_account,obj.getObj().getNickname(), Uri.parse(obj.getObj().getAvatar())));
            if(to_account.equals(Contacts.KEFU_ID)){
                //to do something
            }
        }
    }

    @Override
    public void onFinish() {

    }
};}

仔细看看这代码有没有问题。
盯着to_account看
如果快速请求呢

作者 oshook
安卓技术 6 月 21,2023

接入银联支付

官方文档实在没法看,我是根据视频demo接入的。
接入的是手机控件支付,地址如下:
https://open.unionpay.com/tjweb/acproduct/list?apiservId=450&tdsourcetag=s_pctim_aiomsg

1、导入UPPayAssistEx.jar,UPPayPluginExPro.jar到libs中

还有assets中添加data.bin文件

2、AndroidManifest.xml配置










3、调用以及回调

调用就一句代码:
//”00″ – 启动银联正式环境 “01” – 连接银联测试环境
//tn接口返回 服务器已经做好有返回最好,没有请求http://101.231.204.84:8091/sim/getacptn(官方test请求地址)

UPPayAssistEx.startPay(mContext, null, null, tn,01);
回调(官方demo代码有):

     @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (data == null) {
return;
}

String msg = "";
/*
 * 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
 */
String str = data.getExtras().getString("pay_result");
if (str.equalsIgnoreCase("success")) {
    
// 如果想对结果数据验签,可使用下面这段代码,但建议不验签,直接去商户后台查询交易结果
// result_data结构见c)result_data参数说明
if (data.hasExtra("result_data")) {
String result = data.getExtras().getString("result_data");
try {
JSONObject resultJson = new JSONObject(result);
String sign = resultJson.getString("sign");
String dataOrg = resultJson.getString("data");
// 此处的verify建议送去商户后台做验签
// 如要放在手机端验,则代码必须支持更新证书 
boolean ret = verify(dataOrg, sign, mMode);
if (ret) {
// 验签成功,显示支付结果
msg = "支付成功!";
} else {
// 验签失败
msg = "支付失败!";
}
} catch (JSONException e) {
}
} 
// 结果result_data为成功时,去商户后台查询一下再展示成功
msg = "支付成功!";
} else if (str.equalsIgnoreCase("fail")) {
msg = "支付失败!";
} else if (str.equalsIgnoreCase("cancel")) {
msg = "用户取消了支付";
}

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("支付结果通知");
builder.setMessage(msg);
builder.setInverseBackgroundForced(true);
// builder.setCustomTitle();
builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}

混淆代码

    -keep class org.simalliance.openmobileapi.** {*;}
-keep class org.simalliance.openmobileapi.service.** {*;}

-keep class com.unionpay.** {*;}
作者 oshook
安卓技术 6 月 21,2023

markdown用法

  • Markdown和扩展Markdown简洁的语法
  • 代码块高亮
  • 图片链接和图片上传
  • LaTex数学公式
  • UML序列图和流程图
  • 离线写博客
  • 导入导出Markdown文件
  • 丰富的快捷键

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
: 定义 A
: 定义 B

项目3
: 定义 C

: 定义 D

> 定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注[1].

目录

用 [TOC]来生成目录:

[TOC]

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为:Gamma(n) = (n-1)!quadforall ninmathbb N。
  • 块级公式:

x = dfrac{-b pm sqrt{b^2 - 4ac}}{2a}

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

张三->李四: 嘿,小四儿, 写博客了没?
Note right of 李四: 李四愣了一下,说:
李四-->张三: 忙得吐血,哪有时间写。

或者流程图:

st=>start: 开始
e=>end: 结束
op=>operation: 我的操作
cond=>condition: 确认?

st->op->cond
cond(yes)->e
cond(no)->op
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注 的 内容. ↩

作者 oshook
安卓技术 6 月 21,2023

微信支付弹框问题

没法弹出微信支付问题

首先配置:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN

在build.gradle文件中,添加如下依赖即可:

dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

}

或

dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

}

第二个:
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),

image

包名和类名都一样,不懂微信为什么要怎么做。我们也只能怎么接
第三个:
一定要打包出来才能弹框,一定要打包出来才能弹框,一定要打包出来才能弹框,debug和release都可以。打包出来测
(可以不打包出来,签名在build环境配对就行)
第四个:
用于md5签名的sign是否和接口的一样。
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
统一下单中的sign
第五个:
noncestr和timestamp的取值是不是同一个

作者 oshook
安卓技术 6 月 21,2023

解决融云demo源码没法运行问题

解决融云demo源码没法运行问题

首先说明

1、我下载的是融云2018-10-19的SealTalk源码
2、我android studio开发环境是android studio3.1.4

下面一步步看可能出现的问题

问题1:

image

解决步骤:
1、现在你正确能运行的项目中根目录的build.gradle以及gradle-wrapper.properties文件

image

image

以上两张是我正常能运行项目中的配置,具体要参考你的运行环境查看并修改融云demo源码的相应的配置
2、运行后出现如下图片,请点击箭头

image

到这解决了一半了,看项目结构是不是正常了很多
问题2:

image

点击后接着解决

image

如果出现以上图问题,把27.1.1改为跟build.gradle下一样的26.0.0

OK,这样子正常是能够正常跑项目了

插曲

1、解决过程如果出现

image

证明你setting配置中勾选了offline work。第一次使用请去掉勾选该设置
2、项目是正常能跑到手机上了,但是一打开停在启动页就闪退了。看了下是报HuaWeiClient的错误,后来我把有关华为的配置全注释掉了。结果demo项目一切都正常了
有问题请加QQ群:142739277

作者 oshook

上一 1 … 4 5 6 7 下一个

Copyright © 2023 | 粤ICP备14006518号-3