当前位置: 首页 > news >正文

湖南好搜网站建设网络营销核心要素

湖南好搜网站建设,网络营销核心要素,w网站建设,网站制作服务合同Android设置铃声和闹钟使用的方法是一样的,但是要区别的去获取对应的权限。 统一权限,不管是设置闹钟还是铃声,他们都需要一个系统设置权限如下: //高版本需要WRITE_SETTINGS权限//此权限是敏感权限,无法动态申请,需要…
Android设置铃声和闹钟使用的方法是一样的,但是要区别的去获取对应的权限。

统一权限,不管是设置闹钟还是铃声,他们都需要一个系统设置权限如下:

在这里插入图片描述
在这里插入图片描述

        //高版本需要WRITE_SETTINGS权限//此权限是敏感权限,无法动态申请,需要跳转到系统界面开启if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断是否已经开启权限if (!Settings.System.canWrite(mContext)) {//没有开启这里需要一个弹窗来提醒用户要去设置下这个权限//自己的demo可以忽略此步骤,应用商店权限申请前需要说明mBindView.tvTitle.post {//这是我自己的权限说明弹窗,自己的定义即可OpenWriteDialog.show(this.supportFragmentManager){if (it){//这一步是跳转到系统设置界面,跳转之后有个回调,判断是否已经开启,开启了继续处理下一步val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)intent.data = Uri.parse("package:$packageName")startActivityForResult(intent, PERMISSION_LOCAL_CODE)}}}} else {//开启了运行下一步todo()}} else {//低版本直接运行下一步todo()}
    @RequiresApi(Build.VERSION_CODES.M)override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)//回调判断code是否一致if (requestCode == PERMISSION_LOCAL_CODE){//判断是否已经开启if (Settings.System.canWrite(this)) {//开启了进行下一步todo()}}}
设置铃声或者闹钟前都要先进行上一步的权限判断才可以继续进行

设置闹钟

首先动态判断权限

Manifest.permission.SET_ALARM
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE

然后调用代码即可

RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, uri)

注意这里的uri是手机本地的铃声路径,大多数的需求是下载网络.mp3 铃声到本地,然后更新闹钟,这里注意下下载之后需要更新到媒体库才可以正常设置,否则设置出来可能是未知或者直接设置不成功----------如何下载更新到媒体库后面统一讲

设置铃声

同闹钟一样,首先需要动态获取权限

Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE

其次设置铃声即可

RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, uri)

这里的uri同闹钟一样,需要更新到媒体库才可以设置

下载网页铃声到本地

在这里插入图片描述

DownloadUtil.download("网页链接","存储路径", "文件名称.mp3",object : DownloadUtil.OnDownloadListener{override fun onDownloadSuccess(file: File?) {//下载成功以及下载后的文件}override fun onDownloading(progress: Int) {//下载进度}override fun onDownloadFailed(e: Exception?) {//下载失败}})
存储路径地址这里给出建议写法
    private fun getUrlPath(): String {val externalFilesDir: File? = this.getExternalFilesDir("")val customFile = File(externalFilesDir!!.absolutePath, "Sandbox")if (!customFile.exists()) {customFile.mkdirs()}return customFile.absolutePath + File.separator}
文件名称后缀 .mp3即可

DownloadUtil源码

object DownloadUtil {private var okHttpClient: OkHttpClient? = null/*** @param url          下载连接* @param destFileDir  下载的文件储存目录* @param destFileName 下载文件名称* @param listener     下载监听*/fun download(url: String, destFileDir: String, destFileName: String, listener: OnDownloadListener) {if (url == null || url == ""){return}if (okHttpClient == null){okHttpClient = OkHttpClient()}val request: Request = Request.Builder().url(url).build()okHttpClient!!.newCall(request).enqueue(object : Callback {override fun onFailure(call: Call, e: IOException) {// 下载失败监听回调listener.onDownloadFailed(e)}@Throws(IOException::class)override fun onResponse(call: Call, response: Response) {if (response.body != null) {var inputStream: InputStream? = nullval buf = ByteArray(2048)var len = 0var fos: FileOutputStream? = null// 储存下载文件的目录val dir = File(destFileDir)if (!dir.exists()) {dir.mkdirs()}val file = File(dir, destFileName)try {inputStream = response.body!!.byteStream()val total: Long = response.body!!.contentLength()fos = FileOutputStream(file)var sum: Long = 0while (inputStream.read(buf).also { len = it } != -1) {fos.write(buf, 0, len)sum += len.toLong()val progress = (sum * 1.0f / total * 100).toInt()// 下载中更新进度条listener.onDownloading(progress)}fos.flush()// 下载完成listener.onDownloadSuccess(file)} catch (e: Exception) {listener.onDownloadFailed(e)} finally {try {inputStream?.close()} catch (e: IOException) {listener.onDownloadFailed(e)}try {fos?.close()} catch (e: IOException) {listener.onDownloadFailed(e)}}}else{listener.onDownloadFailed(IOException("接口失败"))}}})}interface OnDownloadListener {/*** @param file 下载成功后的文件*/fun onDownloadSuccess(file: File?)/*** @param progress 下载进度*/fun onDownloading(progress: Int)/*** @param e 下载异常信息*/fun onDownloadFailed(e: Exception?)}}

此时就将网络音频下载到本地了,这时候拿到file是无法更新到闹钟或者铃声的,甚至本地音乐里面都找不它,需要更新到媒体库才可以进行设置

更新到媒体库

更新媒体库使用的是 ContentValues 以前文章写过下载视频到本地,都是一样的,只不过参数不同

在这里插入图片描述
在这里插入图片描述

可以看下参数对比下

更新到媒体库的时候要注意 高版本和低版本区分更新

如果你此时使用的是网上大多数的 MediaScannerConnection.scanFile() 方法,大概率是不会成功的

使用
DangUtils.setMYRingtone(mContext,mDownFile!!.absolutePath,mDownType,mDownName);

其中 mDownFile 就是我下载到本地的文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

DangUtils 代码

object DangUtils {/*** 将资源更新到媒体库* context - 上下文* filePath - 本地路径* type - 类型-设置闹钟还是铃声* name - 名称,提示用户的 可有可无*/fun setMYRingtone(context: Context, filePath: String?,type: String,name: String): Boolean {if (filePath == null || filePath == ""){return false}return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {saveVideoToAlbumBeforeQ(context, filePath,type,name)} else {saveVideoToAlbumAfterQ(context, filePath,type,name)}}private fun saveVideoToAlbumAfterQ(context: Context, filePath: String,mDownType: String,name: String): Boolean {return try {val contentResolver = context.contentResolverval tempFile = File(filePath)val contentValues = getVideoContentValues(context, tempFile, System.currentTimeMillis())val uri = contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues)copyFileAfterQ(context, contentResolver, tempFile, uri)contentValues.clear()contentValues.put(MediaStore.MediaColumns.IS_PENDING, 0)context.contentResolver.update(uri!!, contentValues, null, null)context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri))if (mDownType == Setting_LS) {// 设置系统来电铃声RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, uri)Toast.makeText(context, "已将${name}设置为来电铃声", Toast.LENGTH_SHORT).show()}else{RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, uri)Toast.makeText(context, "已将${name}设置为闹铃", Toast.LENGTH_SHORT).show()}true} catch (e: java.lang.Exception) {e.printStackTrace()if (mDownType == Setting_LS) {Toast.makeText(context, "铃声设置失败", Toast.LENGTH_SHORT).show()}else{Toast.makeText(context, "闹铃设置失败", Toast.LENGTH_SHORT).show()}false}}private fun saveVideoToAlbumBeforeQ(context: Context, videoFile: String,mDownType: String,name: String): Boolean {val picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)val tempFile = File(videoFile)val destFile = File(picDir, context.packageName + File.separator + tempFile.name)var ins: FileInputStream? = nullvar ous: BufferedOutputStream? = nullreturn try {ins = FileInputStream(tempFile)ous = BufferedOutputStream(FileOutputStream(destFile))var nread = 0Lval buf = ByteArray(1024)var n: Intwhile (ins.read(buf).also { n = it } > 0) {ous.write(buf, 0, n)nread += n.toLong()}MediaScannerConnection.scanFile(context, arrayOf(destFile.absolutePath),null) { path: String?, uri: Uri? ->if (mDownType == Setting_LS) {// 设置系统来电铃声RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, uri)Toast.makeText(context, "已将${name}设置为来电铃声", Toast.LENGTH_SHORT).show()}else{RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, uri)Toast.makeText(context, "已将${name}设置为闹铃", Toast.LENGTH_SHORT).show()}}true} catch (e: java.lang.Exception) {e.printStackTrace()if (mDownType == Setting_LS) {Toast.makeText(context, "铃声设置失败", Toast.LENGTH_SHORT).show()}else{Toast.makeText(context, "闹铃设置失败", Toast.LENGTH_SHORT).show()}false} finally {try {ins?.close()ous?.close()} catch (e: IOException) {e.printStackTrace()}}}@Throws(IOException::class)private fun copyFileAfterQ(context: Context,localContentResolver: ContentResolver,tempFile: File,localUri: Uri?) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&context.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q) {//拷贝文件到相册的uri,android10及以上得这么干,否则不会显示。可以参考ScreenMediaRecorder的save方法val os = localContentResolver.openOutputStream(localUri!!)Files.copy(tempFile.toPath(), os)os!!.close()tempFile.delete()}}/*** 获取视频的contentValue*/private fun getVideoContentValues(context: Context, paramFile: File, timestamp: Long): ContentValues {val localContentValues = ContentValues()if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {localContentValues.put(MediaStore.Audio.Media.RELATIVE_PATH, Environment.DIRECTORY_MUSIC+ File.separator + context.packageName)}localContentValues.put(MediaStore.Audio.Media.TITLE, paramFile.name)localContentValues.put(MediaStore.Audio.Media.DISPLAY_NAME, paramFile.name)localContentValues.put(MediaStore.Audio.Media.MIME_TYPE, "music/mp3")localContentValues.put(MediaStore.Audio.Media.DATE_TAKEN, timestamp)localContentValues.put(MediaStore.Audio.Media.DATE_MODIFIED, timestamp)localContentValues.put(MediaStore.Audio.Media.DATE_ADDED, timestamp)localContentValues.put(MediaStore.Audio.Media.SIZE, paramFile.length())return localContentValues}}
http://www.wooajung.com/news/31516.html

相关文章:

  • csdn 个人网站建设google网站推广
  • cvm服务器做网站互联网营销师怎么报名
  • 博客系统做网站白云区最新疫情
  • 株洲网站制作公司有哪些torrentkitty磁力官网
  • 怎么做游戏充值代理网站常用的seo查询工具有哪些
  • 做什么网站开发最简单员工培训
  • 如何更改网站内链大连seo建站
  • 秦皇岛城乡建设局电话网络关键词优化方法
  • 咸阳网站建设多少钱招商外包
  • 多语言网站建设平台代理企业如何开展网络营销
  • 深圳网站开发工程师郑州seo优化推广
  • 南昌定制网站开发费用北京seo优化wyhseo
  • 网站方案编写成都网站推广哪家专业
  • 七牛做网站兰州seo优化公司
  • 济南制作网站实时热搜
  • 网站开发前端和后端怎么连接网站维护工作内容
  • 网站维护 年费企业培训有哪些方面
  • 烟台建网站哪家好建网站找谁
  • 做网站建设的方案线上线下一体化营销
  • 泗阳做网站360优化大师旧版
  • 个人网站免费域名获取专业郑州企业网站建设
  • 有专门做试吃的网站吗百度提交网站收录查询
  • 网页制作淘宝网站建设网站seo批量查询工具
  • 台州市网站建设网站优化培训
  • 后台做网站的题网络营销专业代码
  • 给客户做网站建设方案今日新闻
  • 阿里云增加网站宁德市医院东侨院区
  • 网站tkd怎么做优化大师会员兑换码
  • wordpress怎么做网盘站奶茶店推广软文500字
  • 公司做网站建设价格女儿考试没圈关键词