安卓Q平台 google日历-设置-常规设置-日历通知-点击提示音,弹出android.process.media停止运行
其实,本人是比较害怕数据库之类的东西的,感觉查询语言什么很复杂,又涉及到各种uri,路径,再加上Google本身改了不少版本,就很懵
但是,问题来了,只能硬着头皮上了,根据我的判断,感觉大概就是uri的问题,就试着加了一些log
ok: mHasDefaultItem = true, mUriForDefaultItem = content://settings/system/notification_sound,
mHasSilentItem = true, mType = 2, mExistingUri = content://settings/system/notification_sound
error: mHasDefaultItem = true, mUriForDefaultItem = content://settings/system/notification_sound,
mHasSilentItem = true, mType = 2, mExistingUri = android.resource://com.google.android.calendar/raw/timely_event
根据log,发现的问题是,google传入的是android.resource://com.google.android.calendar/raw/timely_event,他自己的东西可能是,但是呢这个东西在系统里肯定是没有的,于是就报错了
虽然说是Google的apk,我们没有义务去改,但是抱着试试的态度就上了,我的想法是,在他报错的时候 我给他返回系统本身的通知,供用户选择
alps/packages/providers/MediaProvider/src/com/android/providers/media/RingtonePickerActivity.java
public void onPrepareListView(ListView listView) {
// Reset the static item count, as this method can be called multiple times
mStaticItemCount = 0;
Log.d(TAG, "onPrepareListView>>>: mClickedPos = " + getCheckedItem());
// Add by +++++++++++++++++++++++ start
ListView forErrorListView = listView;
// Add by +++++++++++++++++++++++ end
if (mHasDefaultItem) {
mDefaultRingtonePos = addDefaultRingtoneItem(listView);
if (getCheckedItem() == POS_UNKNOWN && RingtoneManager.isDefault(mExistingUri)) {
setCheckedItem(mDefaultRingtonePos);
}
}
if (mHasSilentItem) {
mSilentPos = addSilentItem(listView);
// The 'Silent' item should use a null Uri
// M: Bug_id: add Dual SIM Card ringtone. chenchunyong 20170526 {
if ((getCheckedItem() == POS_UNKNOWN && mExistingUri == null) || RingtoneManager.SILENT_RINGTONE_URI.equals(mExistingUri)) {
//if (getCheckedItem() == POS_UNKNOWN && mExistingUri == null) {
// M: }
setCheckedItem(mSilentPos);
}
}
if (getCheckedItem() == POS_UNKNOWN) {
// Modify +++++++++++++++++++++++++++++++++ start
/* ok: mHasDefaultItem = true, mUriForDefaultItem = content://settings/system/notification_sound,
mHasSilentItem = true, mType = 2, mExistingUri = content://settings/system/notification_sound
error: mHasDefaultItem = true, mUriForDefaultItem = content://settings/system/notification_sound,
mHasSilentItem = true, mType = 2, mExistingUri = android.resource://com.google.android.calendar/raw/timely_event*/
int ringtonePosition = 0;
try {
ringtonePosition = mRingtoneManager.getRingtonePosition(mExistingUri);
} catch (NumberFormatException e) {
mExistingUri = mUriForDefaultItem;
onPrepareListView(forErrorListView);
e.printStackTrace();
return;
}
// Modify ++++++++++++++++++++++++++++++++++++++ end
setCheckedItem(getListPosition(ringtonePosition));
}
Log.d(TAG, "onPrepareListView<<<: mClickedPos = " + getCheckedItem()
+ ", mExistingUri = " + mExistingUri);
// In the buttonless (watch-only) version, preemptively set our result since we won't
// have another chance to do so before the activity closes.
if (!mShowOkCancelButtons) {
setSuccessResultWithRingtone(getCurrentlySelectedRingtoneUri());
}
// If external storage is available, add a button to install sounds from storage.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
addNewSoundItem(listView);
}
// Enable context menu in ringtone items
registerForContextMenu(listView);
}
具体来说,就是报错的时候我给mExistingUri 赋值默认的uri,在list设置选中条目之前,重新执行这个函数,并return掉,这样就避免了报错
本来看到是Google报错,另外又是多媒体报错,我根本就不想去改,一方面是省的麻烦,另一方面是担心花了很长时间还改不好。通过这个问题,看来有时候还是要相信自己,大胆的去尝试一把。