Mr.Alright---安卓Q Google日历选择提示音报错的解决及解决后的思考

安卓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报错,另外又是多媒体报错,我根本就不想去改,一方面是省的麻烦,另一方面是担心花了很长时间还改不好。通过这个问题,看来有时候还是要相信自己,大胆的去尝试一把。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值