铃声设置的流程

Android系统铃声设置的流程

Sound & notification
–> General —> Phone ringtone
Default notification sound


单卡情况下:

直接跳到RingtonePickerActivity这个list列表,进行选择铃声的操作。

双卡情况下:

调到选择sub sim卡的界面,待选择完sim卡,然后载调到RingtonePickerActivity这个list列表,进行选择铃声的操作。

到底是怎么跳转到RingtonePickerActvity界面的,因为在EditProfile界面并未看到任何显示或者隐式打开RingtonePickerActivity的入口。

以ringtone的设置为例:

private void initRingtone(PreferenceScreen parent) {
    //这里看到,找控件,也就是Phone ringtone这个preference,可以看出其实际为 DefaultRingtonePreference 
    mVoiceRingtone = (DefaultRingtonePreference) parent.findPreference(KEY_RINGTONE);
    mVideoRingtone = (DefaultRingtonePreference) parent.findPreference(KEY_VIDEO_RINGTONE);
    mSipRingtone = (DefaultRingtonePreference) parent.findPreference(KEY_SIP_RINGTONE);
}
在EditProfile中找不到跳转的入口,那就进入DefaultRingtonePreference去看下有没有,但是仍然找不到,只能找到onPrepareRingtonePickerIntent方法,看着像,但是并未有哪里执行了startActvity啊。
public class DefaultRingtonePreference extends RingtonePreference {。。。。}
   那可以看到DefaultRingtonePreference 的父类为RingtonePreference ,所以可以看下,是不是在父类中有相应的解释,追踪到
frameworks/base/core/java/android/preference/RingtonePreference.java

果然找到了,父类内部实现了onclick事件,并且在其中调用onPrepareRingtonePickerIntent方法,将其中初始化的intent同样作为参数,start出去。现在就一目了然了。

@Override
protected void onClick() {
    // Launch the ringtone picker 那就是这里了,隐式得跳转,通过action
    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    onPrepareRingtonePickerIntent(intent);
    PreferenceFragment owningFragment = getPreferenceManager().getFragment();
    if (owningFragment != null) {
        owningFragment.startActivityForResult(intent, mRequestCode);
    } else {
        getPreferenceManager().getActivity().startActivityForResult(intent, mRequestCode);
    }
}

而且可以发现,其是以startActvityForResult的方式来跳转,那么必然有onActivityResult方法。

public boolean onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == mRequestCode) {

            if (data != null) {
                Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

                if (callChangeListener(uri != null ? uri.toString() : "")) {
                    //这里会调用onSaveRingtone方法
                    onSaveRingtone(uri);
                }
            }

            return true;
        }

        return false;
    }

正好可以对应到,在ringtonePicker列表中选择完毕铃声后,返回后设置了铃声的动作,这里在其子类DefaultRingtonePreference中完成了重写。

/**
     * Called when the ringtone is choosen, set the selected ringtone uri to framework
     *
     * @param ringtoneUri
     * the selected ringtone uri
     */
    @Override
    protected void onSaveRingtone(Uri ringtoneUri) {
  //xxw
  int simNum = SubscriptionManager.from(getContext()).getActiveSubscriptionInfoCount();
  if(simNum == 0){
   Toast.makeText(mContext, mContext.getString(R.string.no_sim_card_tip), 2000).show();
  }else {//xxw .
        SharedPreferences prefs = this.getContext().getSharedPreferences(
                "DefaultRingtonePreference", Context.MODE_PRIVATE);
        mSimId = prefs.getLong(PREF_SIM_ID_VALUME, -1);
        mProfileManager.setRingtoneUri(mKey, getRingtoneType(), mSimId, ringtoneUri);
        Log.d("kiki","onSaveRingtone ringtoneUri="+ringtoneUri.toString());
  }//xxw
    }
在安卓应用程序中,你可以通过以下步骤更改来电铃声: 1. 在你的应用程序中,创建一个选择铃声的界面,例如一个列表或网格视图,显示可用的铃声。 2. 通过使用MediaStore类中的查询方法,从系统中获取可用的铃声列表。 3. 对列表进行适当的处理和呈现,以便用户可以选择他们喜欢的铃声。你可能需要使用一个适配器类来显示列表中的铃声。 4. 当用户选择铃声时,调用RingtoneManager类中的setActualDefaultRingtoneUri()方法,将所选铃声的URI设置为来电铃声的默认值。 5. 如果用户想要设置来电铃声为自定义铃声,则需要使用Android的权限系统来授予应用程序访问存储权限,以便在用户设备上读取铃声文件。 下面是一个简单的代码流程示例,用于从系统中获取可用的铃声列表,并将所选铃声设置为来电铃声: ```java // 获取铃声的URI列表 Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME }; String selection = MediaStore.Audio.Media.IS_RINGTONE + "!= 0"; Cursor cursor = getContentResolver().query(uri, projection, selection, null, null); // 处理铃声列表 ArrayList<String> ringtoneList = new ArrayList<String>(); while (cursor.moveToNext()) { String ringtoneName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); ringtoneList.add(ringtoneName); } // 显示铃声列表,让用户选择一个铃声 // ... // 设置所选铃声为来电铃声 Uri selectedRingtoneUri = Uri.parse("content://media/external/audio/media/" + ringtoneId); RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, selectedRingtoneUri); ``` 请注意,上述示例仅涵盖了从系统中获取铃声列表和设置所选铃声为来电铃声的基本步骤。在实际应用中,你需要考虑到更多的细节和异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值