最新消息:

URI为NULL时使用toString()将URI转换成String,导致android app奔溃

android 大步 1284浏览 0评论

最近在写android的 Notification代码的时候,涉及到通知铃声。但是在android模拟器上不但通知没有声音,而且点击声音通知的按钮时候就直接提示应用异常错误,强制退出。

Notification 通知 铃声设置代码如下:
代码一:

 

但是在android模拟器中不但没听到通知的铃声,而且应用异常错误,强制退出,提示空指针错误。
原因分析:
其中   getActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_NOTIFICATION)  的源代码在 C:\Android\android-sdk\sources\android-14\android\media\RingtoneManager.java  :
代码二:

 

可见getActualDefaultRingtoneUri(Context context, int type) 要么返回是 Uri  ,要么是 NULL 。
所以,我尝试将toString()去掉,直接将上面的代码一改成:

 

然后,点击按钮通知按钮后,虽然还是没有听到通知铃声,但是应用不会报异常错误。由此可见,是 toString()的原因导致的。
没有听到通知铃声的原因是因为 RingtoneManager.getActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_NOTIFICATION) 返回的是 NULL 。
 RingtoneManager.getActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_NOTIFICATION) 的作用是获取android系统设置的通知铃声。
  • TYPE_NOTIFICATION :代表系统设置的通知铃声
  • TYPE_RINGTONE : 代表系统设置的来电铃声
  • TYPE_ALARM:代表系统设置的闹铃声
所以,我去查看了 android 模拟器 emulator 的 通知铃声设置,结果发现,系统的通知铃声、手机铃声、闹铃声音被设置成了 silent  !!!  所以需要我们手动设置通知铃声、手机铃声、闹铃声音。 问题是,根本就没有选项供我设置啊!!
同时,android emulator 中没有铃声文件。最后,我想到了自己去拷贝一个mp3文件到android emulater中。方法,使用adb将文件push进去。
1.先将1.mp3 复制到 adb所在目录,然后执行:
> adb   push 1.mp3  sdcard/
2.在 adb shell 将 1.mp3 拷贝到 notification:
#mv 1.mp3  Notifications/
如果是要将1.mp3 设置为 来电铃声,就拷贝到 Ringtones 目录
如果是要设置为闹铃声,就拷贝到的 Alarms 目录
3.接着到模拟器的 Dev Tools --> Media  Provider-->Scan SDcard,扫描完毕后,点击 Insert XX albums 。
4. 去android的 设置中声音设置,就可以将 1.mp3 设置为 通知铃声了。
接着又分别测试了代码一 ,点击通知按钮后,声音出来了,也没有报错。
总结:
1.android emulator 默认是不带铃声的,也没有铃声文件,所以默认是被设置为silent 。要自己手动添加和设置铃声。
2.模拟器毕竟模拟器,建议还是直接在真机上测试,而且操作和反映速度还快很多。额,不知道为毛模拟器这么卡。
3. 对于URI为NULL时,如果对其使用 toString() 方法将URI 转换为 String,这样会导致应用程序奔溃,提示空指针错误。

 

来自为知笔记(Wiz)

转载请注明:大步's Blog » URI为NULL时使用toString()将URI转换成String,导致android app奔溃

SiteMap