Androidアプリケーションに小さな問題があります。私のアプリには、デフォルトの着信音または通知として設定できるようにしたいmp3ファイルがいくつかあります。私はこの投稿の指示に従いましたAndroidでの着信音の設定そしてそれは一種の作品です。
これが私のコードです:
着信音として設定するファイルの作成:
public static String createFile(String raw, int choice){
File newSoundFile = null;
String path = (choice == 0) ? "/mnt/sdcard/media/mySoundsRingtone.mp3" : "/mnt/sdcard/media/mySoundsNotification.mp3";
newSoundFile = new File(path);
if(newSoundFile.exists()){
try {
newSoundFile.delete();
} catch (Exception e) {
Toast.makeText(cont, "delete failed", Toast.LENGTH_SHORT).show();
return null;
}
}
try {
newSoundFile.createNewFile();
} catch (IOException e) {
Toast.makeText(cont, "file creation failed", Toast.LENGTH_SHORT).show();
return null;
}
//Toast.makeText(cont, "file created", Toast.LENGTH_SHORT).show();
Uri mUri = Uri.parse("android.resource://my.package.name/"+raw);
ContentResolver mCr = cont.getContentResolver();
AssetFileDescriptor soundFile;
try {
soundFile= mCr.openAssetFileDescriptor(mUri, "r");
} catch (FileNotFoundException e) {
Toast.makeText(cont, "AssetFileDescriptor failed", Toast.LENGTH_SHORT).show();
soundFile=null;
return null;
}
try {
byte[] readData = new byte[1024];
FileInputStream fis = soundFile.createInputStream();
FileOutputStream fos = new FileOutputStream(newSoundFile);
int i = fis.read(readData);
while (i != -1) {
fos.write(readData, 0, i);
i = fis.read(readData);
}
fos.close();
} catch (Exception io) {
Toast.makeText(cont, "copy failed", Toast.LENGTH_SHORT).show();
return null;
}
return path;
}
ファイルを着信音として設定する:
public static void setValues(String path, int choice){
File newSoundFile = new File(path);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "my ringtone");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length());
values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
if(choice == 0){
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
}
else{
values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
}
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath());
Uri newUri = mCr.insert(uri, values);
try {
if(choice == 0)RingtoneManager.setActualDefaultRingtoneUri(cont, RingtoneManager.TYPE_RINGTONE, newUri);
else RingtoneManager.setActualDefaultRingtoneUri(cont, RingtoneManager.TYPE_NOTIFICATION, newUri);
} catch (Throwable t) {
Log.d("LOG", "catch exception");
}
}
両方を呼び出す:
public static void setRingTone(String raw, int choice){
setValues(createFile(raw, choice), choice);
}
つまり、最初に着信音を選択すると、新しいファイルが作成され、サウンドが着信音として適切に割り当てられます。もう一度クリックして着信音を選択すると、古い着信音ファイルが削除されて正しく再作成されますが、着信音として設定されていません(呼び出されるとバイブレーションのみが発生します)。しかし、.mp3ファイルを手動で削除し、アプリに移動して着信音を再度選択すると、機能します。コードからファイルを削除した場合と、ファイルブラウザーから手動で削除した場合では、動作が異なるのはなぜですか。
何が問題になるのか、何か考えはありますか?
前もって感謝します!