[Android4.4]Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED

摘要: Android4.4修改了MEDIA_MOUNTED广播的权限,导致发送这个广播会出现权限问题,本文分析这个问题出现的原因,并给出解决方案.

 

0. 问题背景

在Android4.4之前,许多应用程序使用如下代码去通知更新文件数据库

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
     Uri.parse(\"file://\" + Environment.getExternalStorageDirectory())));

这样做的坏处:每次发送这个广播,都会让MediaScanner重新扫描一次系统文件,很影响设备的电池寿命。当然传入的路径可以 是单个文件或者内容很少的文件夹,会减轻扫描系统文件的压力,但是还是会因为扫描频繁而浪费电。所以在Android4.4开始,只允许系统应用发送这样的intent。 所以在Android4.4系统的机器上会出现如下错误:

 Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED

1. 解决办法:

1 . 将Intent换为 ACTION_MEDIA_SCANNER_SCAN_FILE.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, 
     Uri.parse(\"file://\" + Environment.getExternalStorageDirectory())));

但是这个Intent只扫描文件,不扫描文件夹。如果你的应用只操作单个文件而不是文件夹,就可以使用这个。 2. 不发广播,换为MediaScannerConnection进行通知更新

 MediaScannerConnection.scanFile(this,
          new String[] { file.toString() }, null,
          new MediaScannerConnection.OnScanCompletedListener() {
      public void onScanCompleted(String path, Uri uri) {
          Log.i(\"ExternalStorage\", \"Scanned \" + path + \":\");
          Log.i(\"ExternalStorage\", \"-> uri=\" + uri);
      }
 });

这样做就属于不发送广播,在4.4上可以正常工作.

阅读全文

Android开发:Log2File工具类

Log2File工具类是用于Android程序将Log记录到文件中(如sd卡)的工具,应用场景:



1. 无法连接电脑进行调试(usb线被usbotg占用)
2. Log不容易被抓取
3. Bug出现很随机,不是必出现
4. 其他自己脑补

## 0.说明

这篇文章最早是在我的CSDN博客上面发布了:http://blog.csdn.net/grackergao/article/details/18322749 .现在讲他转移到了这里,代码的Github地址 :https://github.com/Gracker/Android-Utils/blob/master/Log2File.java

阅读全文

Android Service:开发自己的通知中心(2):辅助性服务实战

1.辅助性服务实战介绍

上一篇文章介绍了什么是Accessibility以及简单的使用,这一篇文章就来讲讲如何使用Accessibility服务来创建一个简单的Android通知中心。Android中通知中心是一个系统层面的服务,负责显示应用和系统发来的通知(Notification,比如USB插入、选择输入法、未接来电、截图、天气信息、新闻推送等等)。在android4.3之前,一般的第三方应用是无法获取Notification list的(在Android4.3之后,有了一个新的接口,NotificationListenerService.getActiveNotifications(),可以获取当前的Notification)。但是利用Accessibility服务可以监听到各种事件的特性,可以开发一个第三方的通知中心,实现与系统通知栏类似的功能。

阅读全文

Android:Ubuntu下执行Adb命令找不到设备

1.问题概述

最近开发Nokia项目,遇到的问题如下:

插入Nokia x后,电脑没有反应,即不识别,同事的windows也不识别,最后在谷歌上搜索了良久,才找到了解决方案,但是没有记录,后来又要给别人配置的时候,发现忘记怎么配置了。想想这也是一个具有通性的问题,还是记录下来,分享给大家。

2.问题解决方案

首先问题是:执行adb命令提示找不到设备,在做其他操作之前,请先确认已经做了如下操作:

  1. 确定已经打开了USB调试选项(设置-开发者选项-USB调试),有的机器没有开发者选项,需要到关于里面点击版本号若干下,或者去百度谷歌。
  2. 确定使用sudo命令adb kill-server 和adb start-server后仍然没有用。
    如果上述操作都确认了,还是找不到设备,那么继续往下看:

阅读全文

Android Service:开发自己的通知中心(1):辅助性服务介绍

##

1 辅助性服务介绍

辅助性服务是安卓框架的一个特性,它的设计是为了让已经安装在安卓设备上的应用程序能够为用户提供一种导航式(引导式)回应。一个辅助性服务能够传达给
用户关于这个应用程序的利益,例如把文本转换成语音、当用户手指停留屏幕的一个重要区域时的haptic反馈。这一节涵盖了怎样去创建一个辅助性服务,如何处理应用程序的信息接收,还有如何把信息反馈给用户。
创建自己的辅助性服务

阅读全文