首页 文章 精选 留言 我的

精选列表

搜索[项目归档],共10000篇文章
优秀的个人博客,低调大师

Hadoop项目之Cloudera 5.6.0.1(CDH)的安装部署

1 前言 Cloudera是基于Apache原生的Hadoop组件进行重新封装和加强,Cloudera可以简化Hadoop组件的部署。 更新版本的配置请参阅(CentOS 7): http://cmdschool.blog.51cto.com/2420395/1916322 2 理论基础 2.1 部署软件架构 1)Oracle JDK 2)Cloudera Manager Server and Agent packages 3)Supporting database software 4)CDH and managed service software 2.2 部署步骤和安装方法 2.2.1 安装方法 A)Cloudera Manager安装程序安装(容易) B)yum源方式安装(中等) C)源代码安装(难) 注:本教程使用方法B 2.2.2 部署步骤 1)安装JDK 2)安装并配置数据库 3)安装Cloudera管理服务端 4)安装Cloudera管理代理端 5)安装CDH管理服务软件 6)创建、启动和配置CDH并管理服务 2.3 Cloudera Manager端的相关文件 1 rpm-qlcloudera-manager-server 显示如下: 1 2 3 4 5 6 7 8 9 10 /etc/cloudera-scm-server /etc/cloudera-scm-server/db .properties /etc/cloudera-scm-server/log4j .properties /etc/default/cloudera-scm-server /etc/rc .d /init .d /cloudera-scm-server /opt/cloudera/csd /opt/cloudera/parcel-repo /usr/sbin/cmf-server /var/log/cloudera-scm-server /var/run/cloudera-scm-server 文件与目录功能如下: 1)其中/etc/的2-4行为Cloudera Manager服务端配置文件 2)/opt/cloudera/parcel-repo为下载安装包存放目录 3 实践部分 3.1 环境信息 3.1.1 系统信息 OS = CentOS 6.6 x86_64 注:系统请使用最小化安装,否则可能Sqoop服务可能无法启动 3.1.2 主机信息 Cloudera Manager: ip address=10.168.0.120 hostname=cdm-m.cmdschool.org Cloudera Host1: ip address=10.168.0.121 hostname=cdm-h1.cmdschool.org Cloudera Host2: ip address=10.168.0.122 hostname=cdm-h2.cmdschool.org Cloudera Host3: ip address=10.168.0.123 hostname=cdm-h3.cmdschool.org Cloudera Host4: ip address=10.168.0.124 hostname=cdm-h4.cmdschool.org 3.2 运行环境配置 In Cloudera Manager & Cloudera Host[1-4] 3.2.1 关闭selinux 1 getenforce 如果显示如下: 1 Enforcing 则执行: 1 2 setenforce0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 3.2.2 配置hosts vim编辑/etc/hosts 1 2 3 4 5 10.168.0.120cdm-m.cmdschool.org 10.168.0.121cdm-h1.cmdschool.org 10.168.0.122cdm-h2.cmdschool.org 10.168.0.123cdm-h3.cmdschool.org 10.168.0.124cdm-h4.cmdschool.org 3.2.3 检查主机名称 1 hostname 注:主机名称与上面不一致会影响服务的启动 3.2.4 配置sudo(单用户模式适用,可选) 1 visudo 增加如下组 1 %cloudera-scmALL=(ALL)NOPASSWD:ALL 确认包含如下行: 1 Defaultssecure_path= /sbin : /bin : /usr/sbin : /usr/bin vim编辑/etc/pam.d/su,确保包含如下行 1 sessionrequiredpam_limits.so 3.2.5 关闭防火墙并设置开机不启动 1 2 /etc/init .d /iptables stop chkconfigiptablesoff 3.2.6 优化虚拟内存需求率 1)检查虚拟内存需求率 1 cat /proc/sys/vm/swappiness 显示如下: 1 2)临时降低虚拟内存需求率 1 sysctlvm.swappiness=0 3)永久降低虚拟内存需求率 vim编辑/etc/sysctl.conf 1 2 kernel.shmall=4294967296 vm.swappiness=0 并运行如下命令使生效 1 sysctl-p 3.2.7 解决透明大页面问题 1)检查透明大页面问题 1 cat /sys/kernel/mm/transparent_hugepage/defrag 如果显示为: 1 [always]madvisenever 2)临时关闭透明大页面问题 1 echo never> /sys/kernel/mm/transparent_hugepage/defrag 确认配置生效: 1 cat /sys/kernel/mm/transparent_hugepage/defrag 应该显示为: 1 alwaysmadvise[never] 3)配置开机自动生效 vim编辑/etc/rc.local,加入如下内容 1 echo never> /sys/kernel/mm/transparent_hugepage/defrag 3.3 yum源的安装配置 3.3.1 公共yum源配置 In Cloudera Manager & Cloudera Host[1-4] 1)配置yum源 下载默认yum源 1 wget-P /etc/yum .repos.d/https: //archive .cloudera.com /cm5/redhat/6/x86_64/cm/cloudera-manager .repo 修改为指定版本yum源 vim编辑/etc/yum.repos.d/cloudera-manager.repo修改如下参数: 1 baseurl=https: //archive .cloudera.com /cm5/redhat/6/x86_64/cm/5 .6.0/ 2)安装配置工具 1 yum install -yvimwgetopenssh-clients 3)安装jdk 1 yum install -yoracle-j2sdk1.7 4)安装python 1 yum install -ypython 5)安装ntpd 1 yum install -yntp 3.3.2 Cloudera Manager端yum源配置 In Cloudera Manager 1)安装Cloudera Manager包 1 yum install -ycloudera-manager-daemonscloudera-manager-server 2)安装mysql 1 yum install -ymysql-servermysql-develmysql 3.3.3 Cloudera Manager Agent端yum源配置 In Cloudera Host[1-4] 安装Cloudera Manager Agent包 1 yum install -ycloudera-manager-agentcloudera-manager-daemons 3.4 依赖于yum源的环境配置 3.4.1 配置jdk变量环境 In Cloudera Manager & Cloudera Host[1-4] 1)vim编辑/etc/profile,末尾加入如下内容 1 2 3 4 export JAVA_HOME= /usr/java/jdk1 .7.0_67-cloudera export JRE_HOME=${JAVA_HOME} /jre export CLASSPATH=.:${JAVA_HOME} /lib :${JRE_HOME} /lib export PATH=${JAVA_HOME} /bin :$PATH 2)导入java环境变量 1 source /etc/profile 3)测试jdk的配置 1 java-version 3.4.2 权限检查(单用户模式适用,可选) In Cloudera Manager & Cloudera Host[1-4] 检查以下目录cloudera-scm用户具有完全的权限 检查当前目录权限: 1 ls -ld /opt/cloudera/ 显示如下 1 drwxr-xr-x.4cloudera-scmcloudera-scm4096May2313:51 /opt/cloudera/ 检查子目录权限: 1 ls -lR /opt/cloudera/ 显示如下 1 2 3 4 5 6 7 8 9 10 /opt/cloudera/ : total8 drwxr-xr-x.2cloudera-scmcloudera-scm4096Feb1211:28csd drwxr-xr-x.2cloudera-scmcloudera-scm4096Feb1211:28parcel-repo /opt/cloudera/csd : total0 /opt/cloudera/parcel-repo : total0 同样,检查服务器或客户端目录权限 1 2 3 4 ls -ld /var/log/cloudera-scm-server/ ls -lR /var/log/cloudera-scm-server/ ls -ld /var/lib/cloudera-scm-agent/ ls -lR /var/lib/cloudera-scm-agent/ 3.4.3 检查线程限制配置 In Cloudera Manager & Cloudera Host[1-4] 1 cat /etc/security/limits .d /cloudera-scm .conf 显示如下: 1 2 3 4 5 6 7 8 # #(c)Copyright2014Cloudera,Inc. # cloudera-scmsoftnofile32768 cloudera-scmsoftnproc65536 cloudera-scmhardnofile1048576 cloudera-scmhardnprocunlimited cloudera-scmhardmemlockunlimited 3.4.4 Cloudera Manager端配置 In Cloudera Manager 1)临时校对时间 1 ntpdate0.centos.pool.ntp.org 2)启动并配置ntpd服务自动启动 1 2 /etc/init .d /ntpd start chkconfigntpdon 3.4.5 Cloudera Manager Agen端配置 In Cloudera Host[1-4] 1)临时校对时间 1 ntpdate10.168.0.120 2)vim编辑/etc/ntp.conf 注释掉外网时间服务器并增加内网时间服务器地址 1 2 3 4 5 #server0.centos.pool.ntp.orgiburst #server1.centos.pool.ntp.orgiburst #server2.centos.pool.ntp.orgiburst #server3.centos.pool.ntp.orgiburst server10.168.0.120iburst 3)启动并配置ntpd服务自动启动 1 2 /etc/init .d /ntpd start chkconfigntpdon 3.4.7 安装MySQL JDBC Driver In Cloudera Manager & Cloudera Host[1-4] 1 2 3 4 wgethttp: //dev .mysql.com /get/Downloads/Connector-J/mysql-connector-java-5 .1.39. tar .gz tar zxvfmysql-connector-java-5.1.39. tar .gz mkdir /usr/share/java/ cp mysql-connector-java-5.1.39 /mysql-connector-java-5 .1.39-bin.jar /usr/share/java/mysql-connector-java .jar 3.4.8 配置公钥认证 In Cloudera Manager In Cloudera Manager: 1 ssh -keygen-trsa 注:以上一路回车 In Cloudera Manager Agen: 1 2 3 4 5 ssh -copy- id -i~/. ssh /id_rsa .pubroot@10.168.0.120 ssh -copy- id -i~/. ssh /id_rsa .pubroot@10.168.0.121 ssh -copy- id -i~/. ssh /id_rsa .pubroot@10.168.0.122 ssh -copy- id -i~/. ssh /id_rsa .pubroot@10.168.0.123 ssh -copy- id -i~/. ssh /id_rsa .pubroot@10.168.0.124 InCloudera Manager: 1 2 3 4 5 ssh 10.168.0.120 ssh 10.168.0.121 ssh 10.168.0.122 ssh 10.168.0.123 ssh 10.168.0.124 注:以上如果无需密码登记即成功 3.5 Cloudera Manager安装配置 In Cloudera Manager 3.5.1 修改mysql参数 1)关闭数据库 1 /etc/init .d /mysqld stop 2)备份ib_logfile文件 1 2 3 mkdir /var/lib/backup cd /var/lib/mysql/ mv ib_logfile* /var/lib/backup/ 3)vim编辑/etc/my.cnf 加入如下参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [mysqld] transaction-isolation=READ-COMMITTED #Disablingsymbolic-linksisrecommendedtopreventassortedsecurityrisks; #todoso,uncommentthisline: #symbolic-links=0 key_buffer=16M key_buffer_size=32M max_allowed_packet=32M thread_stack=256K thread_cache_size=64 query_cache_limit=8M query_cache_size=64M query_cache_type=1 max_connections=550 #expire_logs_days=10 #max_binlog_size=100M #log_binshouldbeonadiskwithenoughfreespace.Replace'/var/lib/mysql/mysql_binary_log'withanappropriatepathforyoursystem #andchownthespecifiedfoldertothemysqluser. log_bin= /var/lib/mysql/mysql_binary_log #ForMySQLversion5.1.8orlater.Commentoutbinlog_formatforolderversions. binlog_format=mixed read_buffer_size=2M read_rnd_buffer_size=16M sort_buffer_size=8M join_buffer_size=8M #InnoDBsettings innodb_file_per_table=1 innodb_flush_log_at_trx_commit=2 innodb_log_buffer_size=64M innodb_buffer_pool_size=4G innodb_thread_concurrency=8 innodb_flush_method=O_DIRECT innodb_log_file_size=512M [mysqld_safe] log-error= /var/log/mysqld .log pid- file = /var/run/mysqld/mysqld .pid sql_mode=STRICT_ALL_TABLES 3.5.2 启动并设置开机自动启动 1 2 /etc/init .d /mysqld start chkconfigmysqldon 3.5.3 初始化数据库 1 mysql_secure_installation 向导如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [...] Entercurrentpassword for root(enter for none): OK,successfullyusedpassword,movingon... [...] Setrootpassword?[Y /n ]y Newpassword: Re-enternewpassword: Removeanonymous users ?[Y /n ]y [...] Disallowrootloginremotely?[Y /n ]n [...] Remove test databaseandaccesstoit[Y /n ]y [...] Reloadprivilegetablesnow?[Y /n ]y All done ! 3.5.4 准备scm库 1)方法一 数据库配置: 1 2 3 4 mysql-uroot-p createdatabasescmdefaultcharacter set utf8; grantallprivilegeson*.*toscm@ 'cdm-m.cmdschool.org' identifiedby 'scm' ; flushprivileges; vim编辑/etc/cloudera-scm-server/db.properties修改如下参数: 1 2 3 4 5 com.cloudera.cmf.db. type =mysql com.cloudera.cmf.db.host=cdm-m.cmdschool.org com.cloudera.cmf.db.name=scm com.cloudera.cmf.db.user=scm com.cloudera.cmf.db.password=scm 2)方法二(官方建议) 授权temp权限: 1 2 3 mysql-uroot-p grantallprivilegeson*.*to 'temp' @ '%' identifiedby 'temp' withgrantoption; flushprivileges; 生成配置文件: 1 /usr/share/cmf/schema/scm_prepare_database .shmysql-hcdm-m.cmdschool.org-utemp-ptemp--scm-hostcdm-m.cmdschool.orgscmscmscm 显示如下: 1 2 3 4 5 6 JAVA_HOME= /usr/java/jdk1 .7.0_67-cloudera Verifyingthatwecanwriteto /etc/cloudera-scm-server CreatingSCMconfiguration file in /etc/cloudera-scm-server Executing: /usr/java/jdk1 .7.0_67-cloudera /bin/java - cp /usr/share/java/mysql-connector-java .jar: /usr/share/java/oracle-connector-java .jar: /usr/share/cmf/schema/ .. /lib/ *com.cloudera.enterprise.dbutil.DbCommandExecutor /etc/cloudera-scm-server/db .propertiescom.cloudera.cmf.db. [main]DbCommandExecutorINFOSuccessfullyconnectedtodatabase. All done ,yourSCMdatabaseisconfiguredcorrectly! 确认生成的结果: 1 cat /etc/cloudera-scm-server/db .properties 显示如下: 1 2 3 4 5 6 7 8 9 10 #Auto-generatedbyscm_prepare_database.shonTueMay2419:08:19CST2016 # #ForinformationdescribinghowtoconfiguretheClouderaManagerServer #toconnecttodatabases,seethe"ClouderaManagerInstallationGuide." # com.cloudera.cmf.db. type =mysql com.cloudera.cmf.db.host=cdm-m.cmdschool.org com.cloudera.cmf.db.name=scm com.cloudera.cmf.db.user=scm com.cloudera.cmf.db.password=scm 确认库访问权限: 1 2 mysql-uroot-p showgrants for scm@ 'cdm-m.cmdschool.org' ; 显示如下: 1 2 3 4 5 6 7 +----------------------------------------------------------------------------------------------------------------------+ |Grants for scm@cdm-m.cmdschool.org| +----------------------------------------------------------------------------------------------------------------------+ |GRANTUSAGEON*.*TO 'scm' @ 'cdm-m.cmdschool.org' IDENTIFIEDBYPASSWORD '*45E6E3C68BDF1AC7EBB5C5A3BCBD5E9437B293BE' | |GRANTALLPRIVILEGESON`scm`.*TO 'scm' @ 'cdm-m.cmdschool.org' | +----------------------------------------------------------------------------------------------------------------------+ 2rows in set (0.00sec) 清理数据库用户授权: 1 2 dropuser 'temp' @ '%' ; flushprivileges; 3.5.5 创建附加数据库(可选) 1)附加数据库列表 Role Database User Password ActivityMonitor amon amon amon_password Reports Manager rman rman rman_password Hive Metastore Server metastore hive hive_password Sentry Server sentry sentry sentry_password Cloudera Navigator Audit Server nav nav nav_password Cloudera Navigator Metadata Server navms navms navms_password 2)创建数据库并配置管理账号密码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 mysql-uroot-p createdatabaseamondefaultcharacter set utf8; grantallprivilegesonamon.*to 'amon' @ '%' identifiedby 'amon_password' ; createdatabasermandefaultcharacter set utf8; grantallprivilegesonrman.*to 'rman' @ '%' identifiedby 'rman_password' ; createdatabasemetastoredefaultcharacter set utf8; grantallprivilegesonmetastore.*to 'hive' @ '%' identifiedby 'hive_password' ; createdatabasesentrydefaultcharacter set utf8; grantallprivilegesonsentry.*to 'sentry' @ '%' identifiedby 'sentry_password' ; createdatabasenavdefaultcharacter set utf8; grantallprivilegesonnav.*to 'nav' @ '%' identifiedby 'nav_password' ; createdatabasenavmsdefaultcharacter set utf8; grantallprivilegesonnavms.*to 'navms' @ '%' identifiedby 'navms_password' ; flushprivileges; 3.5.6 配置Oozie库(可选) 1)数据库权限配置 1 2 3 4 5 mysql-uroot-p createdatabaseooziedefaultcharacter set utf8; grantallprivilegesonoozie.*to 'oozie' @ 'localhost' identifiedby 'oozie' ; grantallprivilegesonoozie.*to 'oozie' @ '%' identifiedby 'oozie' ; flushprivileges; 2)配置Oozie库所需软连接 1 2 cd /opt/cloudera/parcels/CDH/lib/oozie/lib/ ln -s /usr/share/java/mysql-connector-java .jarmysql-connector-java.jar 3.5.7 启动服务并配置开机启动 1 2 /etc/init .d /cloudera-scm-server start chkconfigcloudera-scm-serveron 3.5.8 故障排除 1 tail -f /var/log/cloudera-scm-server/cloudera-scm-server .out 3.6 Cloudera Manager Agent安装 In Cloudera Host[1-4] 3.6.1 创建压缩包存放目录 1 2 mkdir -p /opt/cloudera/parcels chown cloudera-scm:cloudera-scm /opt/cloudera/parcels 3.6.2 指定管理服务器和指定包存放目录 vim编辑/etc/cloudera-scm-agent/config.ini确保参数如下并启用: 1 2 3 server_host=cdm-m.cmdschool.org server_port=7182 parcel_dir= /opt/cloudera/parcels 3.6.3 指定运行单用户模式的用户名(仅用于单用户模式,不配置) vim编辑/etc/default/cloudera-scm-agent并取消以下行的注释 1 USER= "cloudera-scm" 3.6.4 启动服务并配置服务器开机启动 1 2 /etc/init .d /cloudera-scm-agent start chkconfigcloudera-scm-agenton 3.6.5 故障排除 如下命令监控启动服务的错误输出 1 tail -f /var/log/cloudera-scm-agent/cloudera-scm-agent .out 3.7 登陆配置 In Cloudera WEB Manager http://10.168.0.120:7180/ 界面配置部分本章节省略…… 更新版本的配置请参阅(CentOS 7): 本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1775398,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android 小项目之--使用【AudioManager】类控制音量

一个好的 Android 应用免不了会自带背景音乐,比如游戏或者一款比较不错的书本阅读器。一些好的应用在自带音乐的时候会多添加一款小功能即可以帮助用户设置声音大小或者改变应用的声音模式。 本篇基于 Android API 中的 AudioManager 作讲述,使看过本篇的读者可以迅速的掌握这个类的实现过程。下面是本篇大纲: 1、认识 AudioManager 2、AudioManager 主要方法介绍 3、程序逻辑实现过程 1、认识 AudioManager AudioManager 类位于 android.Media 包中,该类提供访问控制音量和钤声模式的操作。 2、AudioManager 主要方法介绍 邮于 AudioManager 该类方法过多,这里只讲述几个比较常用到的方法: 方法:adjustVolume(int direction, int flags) 解释:这个方法用来控制手机音量大小,当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。 方法:getMode() 解释:返回当前音频模式。 方法:getRingerMode() 解释:返回当前的铃声模式。 方法:getStreamVolume(int streamType) 解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。 方法:setRingerMode(int ringerMode) 解释:改变铃声模式 3、程序逻辑实现过程 界面上设置了一个图片,表示当前铃声状态,一个进度条表示当前音量大小,五个图片按钮,用来表示增加/减小音量、普通模式、静音模式和震动模式。下面是界面的 XML 布局代码: <? xmlversion="1.0"encoding="utf-8" ?> < AbsoluteLayout android:id ="@+id/layout1" android:layout_width ="fill_parent" android:layout_height ="fill_parent" android:background ="@drawable/white" xmlns:android ="http://schemas.android.com/apk/res/android" > < TextView android:id ="@+id/myText1" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="@string/str_text1" android:textSize ="16sp" android:textColor ="@drawable/black" android:layout_x ="20px" android:layout_y ="42px" > </ TextView > < ImageView android:id ="@+id/myImage" android:layout_width ="48px" android:layout_height ="48px" android:layout_x ="110px" android:layout_y ="32px" > </ ImageView > < TextView android:id ="@+id/myText2" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="@string/str_text2" android:textSize ="16sp" android:textColor ="@drawable/black" android:layout_x ="20px" android:layout_y ="102px" > </ TextView > < ProgressBar android:id ="@+id/myProgress" style ="?android:attr/progressBarStyleHorizontal" android:layout_width ="160dip" android:layout_height ="wrap_content" android:max ="7" android:progress ="5" android:layout_x ="110px" android:layout_y ="102px" > </ ProgressBar > < ImageButton android:id ="@+id/downButton" android:layout_width ="100px" android:layout_height ="100px" android:layout_x ="50px" android:layout_y ="162px" android:src ="@drawable/down" > </ ImageButton > < ImageButton android:id ="@+id/upButton" android:layout_width ="100px" android:layout_height ="100px" android:layout_x ="150px" android:layout_y ="162px" android:src ="@drawable/up" > </ ImageButton > < ImageButton android:id ="@+id/normalButton" android:layout_width ="60px" android:layout_height ="60px" android:layout_x ="50px" android:layout_y ="272px" android:src ="@drawable/normal" > </ ImageButton > < ImageButton android:id ="@+id/muteButton" android:layout_width ="60px" android:layout_height ="60px" android:layout_x ="120px" android:layout_y ="272px" android:src ="@drawable/mute" > </ ImageButton > < ImageButton android:id ="@+id/vibrateButton" android:layout_width ="60px" android:layout_height ="60px" android:layout_x ="190px" android:layout_y ="272px" android:src ="@drawable/vibrate" > </ ImageButton > </ AbsoluteLayout > 程序类分别为: 1、viewHolder 界面上的所有控件和元素都在这里静态声明 package com.terry; import android.media.AudioManager; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; public class viewHolder{ public static ImageButtondownButton; public static ImageButtonupButton; public static ImageButtonnormalButton; public static ImageButtonmuteButton; public static ImageButtonvibrateButton; public static ProgressBarmyProgressBar; public static ImageViewmyImageView; public static AudioManageraudiomanage; } 2、AudioManagerActivity 程序入口处,和主要逻辑代码的处理,程序开头以 (AudioManager)getSystemService(AUDIO_SERVICE); 取得 AudioManager 对象。然后再利用该对象来对铃声进行调整。声明了一个返回 ImageButton 的方法,用来处理各自按钮点击所执行的不同事件和对图片的状态进行调整设置。以下把代码提供给大家: package com.terry; import android.app.Activity; import android.media.AudioManager; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; public class AudioManagerActivity extends Activity{ // 音量变量 private int volume = 0 ; // 声音模式 private int mode; /** Calledwhentheactivityisfirstcreated. */ @Override public void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.main); findview(); // 通过getStreamVolume获得当前音量大小 volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); // 把当前音量的值设置给进度条 viewHolder.myProgressBar.setProgress(volume); // 得到当前的声音模式 mode = viewHolder.audiomanage.getRingerMode(); setImageState(); viewHolder.downButton = btnListener(viewHolder.downButton); viewHolder.upButton = btnListener(viewHolder.upButton); viewHolder.muteButton = btnListener(viewHolder.muteButton); viewHolder.normalButton = btnListener(viewHolder.normalButton); viewHolder.vibrateButton = btnListener(viewHolder.vibrateButton); } // 找到控件 void findview(){ viewHolder.downButton = (ImageButton)findViewById(R.id.downButton); viewHolder.upButton = (ImageButton)findViewById(R.id.upButton); viewHolder.muteButton = (ImageButton)findViewById(R.id.muteButton); viewHolder.normalButton = (ImageButton)findViewById(R.id.normalButton); viewHolder.vibrateButton = (ImageButton)findViewById(R.id.vibrateButton); viewHolder.myImageView = (ImageView)findViewById(R.id.myImage); viewHolder.myProgressBar = (ProgressBar)findViewById(R.id.myProgress); viewHolder.audiomanage = (AudioManager)getSystemService(AUDIO_SERVICE); } // 按钮的单击事件 ImageButtonbtnListener(ImageButtonb){ b.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ // TODOAuto-generatedmethodstub switch (v.getId()){ case R.id.downButton: viewHolder.audiomanage.adjustVolume(AudioManager.ADJUST_LOWER, 0 ); volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); viewHolder.myProgressBar.setProgress(volume); mode = viewHolder.audiomanage.getRingerMode(); setImageState(); break ; case R.id.upButton: viewHolder.audiomanage.adjustVolume(AudioManager.ADJUST_RAISE, 0 ); volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); viewHolder.myProgressBar.setProgress(volume); mode = viewHolder.audiomanage.getRingerMode(); setImageState(); break ; case R.id.muteButton: viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT); volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); viewHolder.myProgressBar.setProgress(volume); viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.mute)); break ; case R.id.normalButton: viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_NORMAL); volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); viewHolder.myProgressBar.setProgress(volume); viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.normal)); break ; case R.id.vibrateButton: viewHolder.audiomanage.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); volume = viewHolder.audiomanage.getStreamVolume(AudioManager.STREAM_RING); viewHolder.myProgressBar.setProgress(volume); viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.vibrate)); break ; } } }); return b; } // 设置图片状态 void setImageState(){ if (mode == AudioManager.RINGER_MODE_NORMAL) { viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.normal)); } else if (mode == AudioManager.RINGER_MODE_SILENT) { viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.mute)); } else if (mode == AudioManager.RINGER_MODE_VIBRATE) { viewHolder.myImageView.setImageDrawable(getResources().getDrawable(R.drawable.vibrate)); } } } 此类大致操作如上,欢迎提建议。 由于公司有加密软件所以上传不了附件。 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/342814,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android 小项目之--解析如何获取SDCard 内存

继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在 Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,显示出来告诉用户。本篇讲述的内容如下: 1、讲述 Environment 类。 2、讲述 StatFs 类。 3、完整例子读取 SDCard 内存 1、讲述 Environment 类 Environment是一个提供访问环境变量的类 。 Environment包含常量: MEDIA_BAD_REMOVAL 解释:返回getExternalStorageState(),表明SDCard 被卸载前己被移除 MEDIA_CHECKING 解释:返回getExternalStorageState(),表明对象正在磁盘检查。 MEDIA_MOUNTED 解释:返回getExternalStorageState(),表明对象是否存在并具有读/写权限 MEDIA_MOUNTED_READ_ONLY 解释:返回getExternalStorageState(),表明对象权限为只读 MEDIA_NOFS 解释:返回getExternalStorageState(),表明对象为空白或正在使用不受支持的文件系统。 MEDIA_REMOVED 解释:返回getExternalStorageState(),如果不存在 SDCard 返回 MEDIA_SHARED 解释:返回getExternalStorageState(),如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回 MEDIA_UNMOUNTABLE 解释:返回getExternalStorageState(),返回SDCard 不可被安装 如果 SDCard是存在但不可以被安装 MEDIA_UNMOUNTED 解释:返回getExternalStorageState(),返回 SDCard 已卸掉如果 SDCard 是存在但是没有被安装 Environment常用方法: 方法:getDataDirectory() 解释:返回 File ,获取 Android 数据目录。 方法:getDownloadCacheDirectory() 解释:返回 File ,获取 Android 下载/缓存内容目录。 方法:getExternalStorageDirectory() 解释:返回 File ,获取外部存储目录即 SDCard 方法:getExternalStoragePublicDirectory(Stringtype) 解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件 方法:getExternalStorageState() 解释:返回 File ,获取外部存储设备的当前状态 方法:getRootDirectory() 解释:返回 File,获取 Android 的根目录 2、讲述 StatFs 类 StatFs一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况 StatFs常用方法: getAvailableBlocks() 解释:返回 Int ,获取当前可用的存储空间 getBlockCount() 解释:返回 Int ,获取该区域可用的文件系统数 getBlockSize() 解释:返回 Int ,大小,以字节为单位,一个文件系统 getFreeBlocks() 解释:返回 Int ,该块区域剩余的空间 restat(Stringpath) 解释:执行一个由该对象所引用的文件系统 3、完整例子读取 SDCard 内存 存储卡在 Android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 ACTION_BROADCAST,本例子将使用上面学到的方法,计算出 SDCard 的剩余容量和总容量。代码如下: package com.terry; import java.io.File; import java.text.DecimalFormat; import android.R.integer; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.os.StatFs; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class getStorageActivity extends Activity{ private ButtonmyButton; /** Calledwhentheactivityisfirstcreated. */ @Override public void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.main); findView(); viewHolder.myButton.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewarg0){ // TODOAuto-generatedmethodstub getSize(); } }); } void findView(){ viewHolder.myButton = (Button)findViewById(R.id.Button01); viewHolder.myBar = (ProgressBar)findViewById(R.id.myProgressBar); viewHolder.myTextView = (TextView)findViewById(R.id.myTextView); } void getSize(){ viewHolder.myTextView.setText( "" ); viewHolder.myBar.setProgress( 0 ); // 判断是否有插入存储卡 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Filepath = Environment.getExternalStorageDirectory(); // 取得sdcard文件路径 StatFsstatfs = new StatFs(path.getPath()); // 获取block的SIZE long blocSize = statfs.getBlockSize(); // 获取BLOCK数量 long totalBlocks = statfs.getBlockCount(); // 己使用的Block的数量 long availaBlock = statfs.getAvailableBlocks(); String[]total = filesize(totalBlocks * blocSize); String[]availale = filesize(availaBlock * blocSize); // 设置进度条的最大值 int maxValue = Integer.parseInt(availale[ 0 ]) * viewHolder.myBar.getMax() / Integer.parseInt(total[ 0 ]); viewHolder.myBar.setProgress(maxValue); StringText = " 总共: " + total[ 0 ] + total[ 1 ] + " \n " + " 可用: " + availale[ 0 ] + availale[ 1 ]; viewHolder.myTextView.setText(Text); } else if (Environment.getExternalStorageState().equals(Environment.MEDIA_REMOVED)){ Toast.makeText(getStorageActivity. this , " 没有sdCard " , 1000 ).show(); } } // 返回数组,下标1代表大小,下标2代表单位KB/MB String[]filesize( long size){ Stringstr = "" ; if (size >= 1024 ){ str = " KB " ; size /= 1024 ; if (size >= 1024 ){ str = " MB " ; size /= 1024 ; } } DecimalFormatformatter = new DecimalFormat(); formatter.setGroupingSize( 3 ); Stringresult[] = new String[ 2 ]; result[ 0 ] = formatter.format(size); result[ 1 ] = str; return result; } } TIP:要判断手机是否安装了存储卡,可通过 Environment.getExternalStorageState()方法来判断存储卡的状态。 如果你不知道如何创建 SDCard 你可回头看我上篇文章: 点击这里 实例运行效果如图 上篇放了两首歌和一个30多M的音频文件,之前创建时给的500MB空间,现在剩下的刚好。 源码下载: /Files/TerryBlog/getSdCardStorage.rar 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/340079,如需转载请自行联系原作者

优秀的个人博客,低调大师

阿里巴巴,排行前10的开源项目!

​ image 1、FastDFS FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 2、Dubbo Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和 Spring 框架无缝集成。 3、Druid Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 4、Fastjson fastjson是一个性能很好的Java语言实现的JSON解析器和生成器,来自阿里巴巴的工程师开发。 5、RocketMQ RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。 6、OceanBase OceanBase是一个支持海量数据的高性能分布式数据库系统,实现了数千亿条记录、数百TB数据上的跨行跨表事务,由淘宝核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。 7、Weex Weex是一款跨平台移动开发工具,能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。 8、Tair Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。 9、Tsar Tsar是淘宝的采集工具,主要用来收集服务器的系统信息(如cpu,io,mem,tcp等)以及应用数据(如squid haproxy nginx等),tsar支持实时查看和历史查看,方便了解应用和服务器的信息。 10、AliSQL AliSQL是基于MySQL官方版本的一个分支,由阿里云数据库团队维护,目前也应用于阿里巴巴集团业务以及阿里云数据库服务。该版本在社区版的基础上做了大量的性能与功能的优化改进。尤其适合电商、云计算以及金融等行业环境。 推荐阅读 2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案 Spring面试题(70道,史上最全) 云栖大会100位顶级大咖演讲PPT+视频全分享! 17张图揭密支付宝系统架构 【推荐】阿里双11背后的技术:不一样的技术创新,阿里巴巴技术演进与超越

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册