廢話:接了個加急項目悄蕾,要求10天完成一個類似來電秀的APP票顾,看來領導是很相信我的技術的础浮,哈哈帆调,(內心OS:尼瑪,臣妾做不到)豆同,然鵝并沒有什么用番刊,還是想想如何實現(xiàn)吧
項目步驟(技術難點拆分)
- 設置鈴聲
- 監(jiān)聽系統(tǒng)來電
- 系統(tǒng)權限獲取
- 接聽掛斷電話
設置鈴聲
設置鈴聲相對來說比較簡單,系統(tǒng)提供了相應的API影锈,獲取音頻文件的URl芹务,調用RingtoneManager的setActualDefaultRingtoneUri方法就OK,代碼如下
public void setRingtoneImpl2(String path) {
File chosenFile = new File(path);
if (chosenFile == null) {
LogUtils.e("file is null");
return;
}
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName());
values.put(MediaStore.MediaColumns.SIZE, chosenFile.length());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, true);
values.put(MediaStore.Audio.AudioColumns.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.AudioColumns.IS_ALARM, false);
values.put(MediaStore.Audio.AudioColumns.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
mContext.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null);
Uri newUri = mContext.getContentResolver().insert(uri, values);
try {
RingtoneManager.setActualDefaultRingtoneUri(
mContext,
RingtoneManager.TYPE_RINGTONE,
newUri
);
} catch (Exception e) {
e.printStackTrace();
}
}
哈哈鸭廷,搞定枣抱,萬事大吉,然鵝辆床。佳晶。。讼载。轿秧,還有雙卡雙待,設置不同sim卡的來電鈴音咨堤。菇篡。。What一喘?驱还??凸克?
雙卡設置不同的鈴聲
再次查看文檔發(fā)現(xiàn)Google大佬就不支持雙卡分別設置鈴聲议蟆,腫么辦。触徐。咪鲜。。撞鹉。疟丙。萬般無奈還是從源碼出發(fā)颖侄,看看能否發(fā)現(xiàn)些蛛絲馬跡,查看setActualDefaultRingtoneUri方法源碼
截屏2020-01-16下午2.37.39.png
發(fā)現(xiàn)源碼是通過修改Setting中的值來修改鈴聲享郊,那么修改卡2的鈴聲是否也可以通過這種方式呢览祖?行不行試試就知道
可以分為兩步:
- 找到Setting的Key
- 通過修改系統(tǒng)Setting設置鈴聲
查找Setting的Key
通過命令 adb shell getprop獲取系統(tǒng)屬性,查找與ring相關的屬性炊琉,嘿嘿展蒂,驚喜來了,下面是華為手機的prop:
截屏2020-01-16下午3.04.53.png
ringtone不就是系統(tǒng)鈴聲的Key值嗎苔咪?因此可以推測下面的ringtone2就是卡2的Key锰悼,行不行試下就知道,直接上代碼:
public void setRingtoneImpl2(String path) {
File chosenFile = new File(path);
if (chosenFile == null) {
LogUtils.e("file is null");
return;
}
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName());
values.put(MediaStore.MediaColumns.SIZE, chosenFile.length());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, true);
values.put(MediaStore.Audio.AudioColumns.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.AudioColumns.IS_ALARM, false);
values.put(MediaStore.Audio.AudioColumns.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
mContext.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null);
Uri newUri = mContext.getContentResolver().insert(uri, values);
try {
RingtoneManager.setActualDefaultRingtoneUri(
mContext,
RingtoneManager.TYPE_RINGTONE,
newUri
);
//華為手機設置卡2
Settings.System.putString(mContext.getContentResolver(), "ringtone2", newUri.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
哈哈团赏,運行成功箕般,到此結束,設置鈴聲完美解決