Android R 设置已删除文件为铃声问题

系统设置铃声的界面,仍然是 frameworks/base/packages/SoundPicker/src/com/android/soundpicker/RingtonePickerActivity.java ,在 RingtonePickerActivity.BadgedRingtoneAdapter 中 bindView 进行加载显示。

设置默认铃声等使用的系统 frameworks/base/media/java/android/media/RingtoneManager.java 中 setActualDefaultRingtoneUri 接口。

RingtonePickerActivity 中设置铃声URI时。存在从存储中删除的文件,uri依然存在的情况,这是因为删除文件不会触发media的数据库重新加载,所以uri依然可以使用。重启机器后这个URI就会被判定无效。

可以在 RingtoneManager.java 中对应的 setActualDefaultRingtoneUri /getActualDefaultRingtoneUri 接口中进行处理,参照 openDefaultRingtoneUri 方法中,先行判断 uri 指向的文件是否存在。不存在重新给一个默认铃声

    public static @Nullable AssetFileDescriptor openDefaultRingtoneUri(
            @NonNull Context context, @NonNull Uri uri) throws FileNotFoundException {
        // Try cached ringtone first since the actual provider may not be
        // encryption aware, or it may be stored on CE media storage
        final int type = getDefaultType(uri);
        final Uri cacheUri = getCacheForType(type, context.getUserId());
        final Uri actualUri = getActualDefaultRingtoneUri(context, type);
        final ContentResolver resolver = context.getContentResolver();

        AssetFileDescriptor afd = null;
        if (cacheUri != null) {
            afd = resolver.openAssetFileDescriptor(cacheUri, "r");
            // 判断文件是否存在,为NULL表示文件不存在
            if (afd != null) {
                return afd;
            }
        }
        if (actualUri != null) {
            afd = resolver.openAssetFileDescriptor(actualUri, "r");
        }
        return afd;
    }

... ...

    public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) {
        AssetFileDescriptor afd = null;
        if (cacheUri != null) {
            afd = resolver.openAssetFileDescriptor(cacheUri, "r");
            // 判断文件是否存在,为NULL表示文件不存在
            if (afd == null) {
                // 当设置 uri 没有对应文件时,拿系统有的文件设置为默认铃声
                String filename = getDefaultRingtoneFilename(type);
                Uri baseUri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
                try (Cursor cursor = context.getContentResolver().query(baseUri,
                        new String[] { MediaColumns._ID },
                        MediaColumns.DISPLAY_NAME + "=?",
                        new String[] { filename }, null)) {
                    if (cursor.moveToFirst()) {
                        ringtoneUri = context.getContentResolver().canonicalizeOrElse(
                                ContentUris.withAppendedId(baseUri, cursor.getLong(0)));
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        String setting = getSettingForType(type);
        if (setting == null) return;
        ... ...
    }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值