安卓漫漫路之实现简单的弹幕.

B站的DanmakuFlameMaster的使用 B站的DanmakuFlameMaster的使用 B站的DanmakuFlameMaster的下载地址:https://github.com/Bilibili/DanmakuFlameMaster    点击打开链接 1、弹幕内容解析 DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI) //xml解析 Dan 阅读详情

直播和看视频中越来越火的控件---弹幕(Danmaku)

本文即介绍怎样实现简单的弹幕效果:咱们使用的是哔哩哔哩开源的弹幕效果库 DanmakuFlameMaster.


必需:首先咱们在项目主工程app/build.gradle中的dependencies闭包中添加如下依赖:

	compile 'com.github.ctiao:DanmakuFlameMaster:0.5.3'

这样我们就将DanmakuFlameMaster库引入到当前项目中了.

开始展示Demo的代码给大家:


首先看咱们的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000">  

    <VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

    <master.flame.danmaku.ui.widget.DanmakuView
        android:id="@+id/danmaku_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:id="@+id/operation_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:background="#fff"
        android:visibility="gone">

        <EditText
            android:id="@+id/edit_text"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            />

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="发送" />
    </LinearLayout>

</RelativeLayout>
.
背景色为黑色,承载我是用的Video来播放本地或者网络视频,DanmakuView即是咱们的弹幕控件,LinearLayout内包含输入框和发送按钮.当然这些都是最普通的控件,最终的界面当然是由您来设定.

接下来看咱们的MainActivity的代码,如下:
.
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.VideoView;

import java.util.Random;

import master.flame.danmaku.controller.DrawHandler;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.IDanmakus;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.ui.widget.DanmakuView;

public class MainActivity extends AppCompatActivity {
    private boolean showDanmaku;
    //弹幕控件
    private DanmakuView danmakuView;
    //DanmakuContext  字体实例
    private DanmakuContext danmakuContext;
    private BaseDanmakuParser parser = new BaseDanmakuParser() {
        @Override
        protected IDanmakus parse() {
            return new Danmakus();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化VideoView控件
        final VideoView videoView = (VideoView) findViewById(R.id.video_view);
        //指定好VideoView的本地路径地址  SD卡根目录的xxx.mp4文件
        videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/xxx.mp4");
        //访问网络视频
        //Uri uri = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
        //设置视频控制器
        //videoView.setMediaController(new MediaController(this));
        //设置视频路径
        // videoView.setVideoURI(uri);
        //开始播放
        videoView.start();

        new android.os.Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                videoView.pause();
            }
        }, 0);

        //初始化弹幕控件
        danmakuView = (DanmakuView) findViewById(R.id.danmaku_view);
        //默认为true 在模拟器上运行有问题
        danmakuView.enableDanmakuDrawingCache(true);
        //看源码得知是一个接口    怎么实现还是要咱们去重写其中的方法
        danmakuView.setCallback(new DrawHandler.Callback() {
            @Override
            public void prepared() {
                //把变量置为 true
                showDanmaku = true;
                //开始运行弹幕控件
                danmakuView.start();
                //随机生成一些弹幕内容以供测试
                generateSomeDanmaku();
            }

            @Override
            public void updateTimer(DanmakuTimer timer) {

            }

            @Override
            public void danmakuShown(BaseDanmaku danmaku) {

            }

            @Override
            public void drawingFinished() {

            }
        });
        //调用  DanmakuContext.create() 完成DanmakuContext的实例化.
        danmakuContext = DanmakuContext.create();
        danmakuView.prepare(parser, danmakuContext);
        //初始化含有输入框和按钮的线性布局
        final LinearLayout operationLayout = (LinearLayout) findViewById(R.id.operation_layout);
        //初始化发送按钮
        final Button send = (Button) findViewById(R.id.send);
        //输入框输入内容
        final EditText editText = (EditText) findViewById(R.id.edit_text);
        //适时的让输入框显现或隐藏
        danmakuView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (operationLayout.getVisibility() == View.GONE) {
                    operationLayout.setVisibility(View.VISIBLE);
                } else {
                    operationLayout.setVisibility(View.GONE);
                }
            }
        });
        //发送按钮的点击事件
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String content = editText.getText().toString();
                if (!TextUtils.isEmpty(content)) {
                    //因为是自己的内容,所以传一个true过去,方法内部会判断这个变量
                    addDanmaku(content, true);
                    //再把输入框置为空
                    editText.setText("");
                }
            }
        });
        //获取到窗体的顶级父类并设置状态栏的显示隐藏
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { //显示状态栏,Activity不全屏显示
                    onWindowFocusChanged(true);
                }
            }
        });
    }

    /**
     * 向弹幕View中添加一条弹幕 
     *
     * @param content    弹幕的具体内容
     * @param withBorder 弹幕是否有边框
     */
    private void addDanmaku(String content, boolean withBorder) {
        //BaseDanmaku 您可以点击进入查看源码实现
        // 弹幕的相关设置:弹幕优先级  颜色  时长  文本  Z轴  Y轴  阴影  描边
        //                下划线  内边距  宽度  高度  存活时间  是否是直播弹幕
        BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
        danmaku.text = content;                  //文本
        danmaku.padding = 5;                     //内边距
        danmaku.textSize = sp2px(20);           //字体大小
        danmaku.textColor = Color.WHITE;       //文本颜色
        danmaku.setTime(danmakuView.getCurrentTime()); //显示时长 偏移时间
        //如果是true 证明是自己的弹幕,那么就可以更改自己想要的颜色了
        if (withBorder) {
            danmaku.borderColor = Color.GREEN;
        }
        //调用底层代码 把弹幕内容添加到LinkedList<Long> mDrawTimes;
        danmakuView.addDanmaku(danmaku);
    }

    /**
     * 随机生成一些弹幕内容以供测试
     */
    private void generateSomeDanmaku() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (showDanmaku) {
                    int time = new Random().nextInt(300);
                    String content = "" + time + time;
                    addDanmaku(content, false);
                    try {
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    /**
     * sp转px的方法。
     */
    public int sp2px(float spValue) {
        final float fontScale = getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    @Override//表示Activity正在停止.
    protected void onPause() {
        super.onPause();
        //如果弹幕控件不为空 && 弹幕控件的线程还存活
        if (danmakuView != null && danmakuView.isPrepared()) {
            //暂停运行弹幕控件
            danmakuView.pause();
        }
    }

    @Override//表示Activity前台并可与用户交互.
    protected void onResume() {
        super.onResume();
        if (danmakuView != null && danmakuView.isPrepared() && danmakuView.isPaused()) {
            danmakuView.resume();
        }
    }

    @Override//表示Activity即将被销毁.
    protected void onDestroy() {
        super.onDestroy();
        //把变量置为false
        showDanmaku = false;
        //如果弹幕控件还存在.调用release(); 底层调用stop(),并把底层的LinkedList<Long> mDrawTimes 置为空;
        if (danmakuView != null) {
            danmakuView.release();
            danmakuView = null;
        }
    }

    @Override//都说这个函数才会使用户可以与应用真正开始进行交互.
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        //看了底层后得知  Build.VERSION.SDK_INT == 20 ;
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                        //这个标志来帮助你的应用维持一个稳定的布局.
                     View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
                   | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        //ctivity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住.
                   | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        //ctivity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住.
                   | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        //Activity全屏显示,且状态栏被隐藏覆盖掉.
                   | View.SYSTEM_UI_FLAG_FULLSCREEN
                        //安卓4.4 新增.
                   | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}





如上,在安卓设备上,一个简单的弹幕Demo就可以实现了.


项目直达下载通道为: Demo_Danmaku


如有问题请多指正,您的指正使我更正确的前行.


Android 弹幕效果深度集成与实战 本文还有配套的精品资源,点击获取 简介:在Android开发中,通过集成DanmakuFlameMaster库实现弹幕效果,增强用户互动体验。本主题详细介绍如何利用该库进行弹幕绘制、管理及用户交互,涵盖绘制机制、数据结构、碰撞检测、速度控制、内存管理、自定义样式等关键点。实践步骤包括添加库依赖、创建DanmakuContext、设置视图、加载和发送弹幕、调整配置以及监听事件... 阅读详情

相关推荐

danmakuflamemaster

视频播放的弹幕控件。支持纯文字、图片、及图文混排。 特性: 使用多种方式(View/SurfaceView/TextureView)实现高效绘制 B站xml弹幕格式解析 基础弹幕精确还原绘制 支持mode7特殊弹幕 多核机型优化,高效的预缓存机制 支持多种显示效果选项实时切换 实时弹幕显示支持 换行弹幕支持/运动弹幕支持 支持自定义字体 支持多种弹幕参数设置 支持多种方式的弹幕屏蔽 还有,就是导入我的demo时,别忘了修改SDK的版本:android:targetSdkVersion="",改成你的,我用的是19

最强大的视频弹幕引擎——烈焰弹幕使(DanmakuFlameMaster)使用指南

简介B站在开源视频直播方面做出的贡献太大了,不仅开源视频控件ijkPlayer,还开源了弹幕引擎DanmakuFlameMaster,集齐整套,可谓神器在手,天下我有。 DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多种自定义功能设置上。

linshijun33的专栏 2万+

FFmpeg音频转AAC/M4A终极指南:从基础到高级参数调优

本文详细介绍了使用FFmpeg将音频转换为AAC/M4A格式的完整指南,从基础安装到高级参数调优。涵盖FDK-AAC编码器的使用、VBR/CBR模式选择、音质控制技巧以及实战案例,帮助用户在不同场景下实现高质量的音频转换。特别适合需要优化音频文件大小与音质平衡的开发者和音频处理专业人士。

rust6ferris的博客 725

开源弹幕引擎·烈焰弹幕使(DanmakuFlameMaster)使用解析

简介DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多种自定义功能设置上。目前,DanmakuFlameMaster 开发包已被包括优酷土豆、开迅视频、MissEvan、echo回声、斗鱼TV、天天动听、被窝声次元、ACFUN 等 APP 使用。Featu

benhuo931115的博客 3万+

用树莓派Pico低成本更新USB-C PD控制器固件实战指南

固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现

weixin_27869497的博客 452

rv1126 读取sensor输入,输出到屏幕显示【RK_MPI API接口】

rv1126 libdrm VO

学习记录 1万+

Android弹幕框架 黑暗火焰使

笑谈风云,一语定乾坤。大家好,我是皖江。 今天我将分享由BiliBili开源的Android弹幕框架(DanmakuFlameMaster)的学习经验。

皖江的博客 6114

STK传感器约束设置保姆级教程:从方位角到传播延迟,手把手教你避开新手常见坑

本文详细解析了STK传感器约束设置的关键技巧,涵盖方位角、仰角、高度及传播延迟等核心参数。通过实战案例和代码示例,指导用户避开常见误区,优化卫星通信和航天任务仿真精度,特别适合STK新手和需要提升传感器配置效率的工程师。

weixin_33701294的博客 392

《再见狂野之心》:绚烂、前卫的朋克文化与刺激竞速的碰撞

《再见狂野之心(Sayonara Wild Hearts)》出自瑞典游戏制作团队 Simogo 之手,这是一支从 iOS 平台起家的精品独立游戏创作团队,也是笔者相当偏爱的开发商之一。从《漫漫旅途(Year Walk)》《6 号设备(DEVICE 6)》《水手之梦(The Sailor's Dream)》等 Simogo 最知名的代表作中,玩家们很容易就能捕捉到作品背后,那一小撮开发者对于优秀视听元素与交互设计的追求。纵观 Simogo 十年来为数不多的出品,其中既有大量注重氛围营造的类视觉小说,也有少部分

wangchewen的博客 190

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

电力市场小白必看:手把手教你用Matlab实现市场出清电价计算(附完整代码)

本文为电力市场初学者提供了使用Matlab计算市场出清电价的完整指南。通过Yalmip和Matpower工具包,详细讲解了从环境配置到模型构建、求解及结果分析的整个过程,帮助读者快速掌握节点电价计算的核心技术。

weixin_30379531的博客 73

【Android -- 开源库】DanmakuFlameMaster 的基本使用

Android 上开源弹幕解析绘制引擎项目。

Kevin Learn Android 2812

深入解析Carry4的内部结构与工作原理

本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

n4o5p6q7r的博客 501

【亲测免费】 DanmakuFlameMaster 教程

**DanmakuFlameMaster** 是哔哩哔哩(B站)开发的一个开源项目,它是一款强大的Android弹幕渲染引擎。该项目旨在提供高效且自定义程度高的弹幕播放器组件,使得开发者能够轻松地在自己的应用程序中集成类似于视频网站中的实时弹幕互动功能。DanmakuFlameMaster支持XML格式的弹幕数据解析,并提供了灵活的弹幕样式设置和动画效果。 ## 2. 项目快速启动 ### 准...

gitblog_00401的博客 676

Ultralytics 框架中predict 与 track 的区别

在 Ultralytics 框架中,predict 和 track 是两种不同的推理方法,分别用于目标检测(或分割、姿态估计)和目标跟踪任务。

浩瀚之水的专栏 1126

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【亲测免费】 《Danmaku FlameMaster: 创新的弹幕渲染引擎》

《Danmaku FlameMaster: 创新的弹幕渲染引擎》 在当今的互联网时代,弹幕文化已经成为了视频分享平台的一大特色。用户们通过发送弹幕参与互动,这种实时的交流方式使得观看体验更加生动有趣。而今天我们要介绍的开源项目——,就是这样一款专为高效、流畅的弹幕渲染打造的强大引擎。 项目简介 Danmaku FlameMaster 是一个由 C++ 开发的高性能弹幕渲染库,它支持多种操作系统,包...

gitblog_00071的博客 636

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

弹幕框架DanmakuFlameMaster简单分析

       随着B站逐渐崛起,其开源弹幕项目DanmakuFlameMaster应用场景也越来越多。我也是在一次偶然机会下发现了这个项目,被其惊艳的效果震撼。以前我就对弹幕技术很感兴趣,可能是因为B站动漫看多,几乎每一部番都是漫天的弹幕乱飞,如果哪部剧没有弹幕反而觉得不适应;久而久之就愈发倾向钻研其原理。       看到效果后,我猜想绘制原理应该是创建一个定时器作为全部弹幕的时间参考,然后每条...

HsuanKeny的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

DanmakuFlameMaster 安装和配置指南

### 项目基础介绍 DanmakuFlameMaster 是一个开源的 Android 弹幕引擎项目,由 Bilibili 开发并维护。它能够高效地解析和绘制弹幕,支持多种弹幕格式和显示效果,适用于各种 Android 应用场景。 ### 主要编程语言 该项目主要使用 Java 语言编写,同时也包含一些 C/C++ 代码用于性能优化。 ## 2. 项目使用的关键技术和框架 ### 关键技术...

gitblog_07984的博客 817

利用B站弹幕引擎(Danmaku)轻松实现弹幕功能

弹幕在直播中是一个比较重要的功能,而开源的B站弹幕可以让我们轻松的实现这个功能。 其实现原理大概就是在页面的上方盖了一层全透明的View,然后再View中添加需要的弹幕效果。 上图: 1、首先,在项目中添加依赖: implementation 'com.github.ctiao:DanmakuFlameMaster:0.5.3' 其次,就在xml文件中添加覆盖的透明View <master.flame.danmaku.ui.widget.DanmakuView android:id="@

lixinxiaos的博客 1万+

【亲测免费】 DanmakuFlameMaster 开源项目使用教程

DanmakuFlameMaster 开源项目使用教程 1. 项目目录结构及介绍 DanmakuFlameMaster 是一个专为Android平台设计的高效弹幕引擎。以下是其大致的项目目录结构及各部分功能简介: DanmakuFlameMaster/ ├── app # 示例应用模块,含主要逻辑与界面展示 │ ├── src │ └── main...

gitblog_00091的博客 809

弹幕简便模版,

直接上依赖: compile 'com.github.ctiao:DanmakuFlameMaster:0.5.3' 控件: <master.flame.danmaku.ui.widget.DanmakuView android:layout_marginTop="650dp" android:id="@+id/danmakuview_show" andr

dongchangqi95的博客 630

android 仿弹幕功能实现(小记)

上周无意在郭神的博客中发现一篇关于弹幕的文章,自己想动手试试

贪吃的小耳朵的博客 1269

仿斗鱼直播的弹幕效果实现

有朋友在公众号里问过我,像直播的那种弹幕效果该如何实现?这篇文章给你答案。

郭霖 3681

DanmakuFlameMaster控制器模块详解:弹幕生命周期的管理者

在视频播放应用中,弹幕(Danmaku)功能已成为增强用户互动体验的关键组件。Android开源弹幕引擎DanmakuFlameMaster(烈焰弹幕使)通过其模块化设计,实现了高性能、可扩展的弹幕渲染系统。本文将深入解析控制器模块的核心架构与工作原理,揭示其如何管理弹幕从创建到销毁的完整生命周期。 ## 控制器模块架构概览 DanmakuFlameMaster的控制器模块位于[Danmaku...

gitblog_00772的博客 947

最简单的弹幕效果

public class MainActivity extends AppCompatActivity { private Button btn; private DanmakuView danmaku; private DanmakuContext danmakuContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav...

qq_45453828的博客 333

DanmakuFlameMaster 常见问题解决方案

DanmakuFlameMaster 是一个开源的 Android 弹幕引擎项目,由 Bilibili 开发并维护。该项目的主要目的是提供一个高效、灵活的弹幕渲染引擎,支持多种弹幕格式和显示效果。项目的主要编程语言是 Java,同时也涉及到一些 C/C++ 代码用于性能优化。 ## 新手使用注意事项及解决方案 ### 1. 弹幕格式解析问题 **问题描述**:新手在使用 DanmakuFla...

gitblog_07986的博客 759
上一篇: 安卓漫漫路之集成三方短信SDK(MOB.com).
下一篇: 安卓漫漫路之AndroidManifest权限大全.
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值