2

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ファイルを手動で削除し、アプリに移動して着信音を再度選択すると、機能します。コードからファイルを削除した場合と、ファイルブラウザーから手動で削除した場合では、動作が異なるのはなぜですか。

何が問題になるのか、何か考えはありますか?

前もって感謝します!

4

2 に答える 2

2

数時間検索した後、私はこの投稿で答えを見つけました: オーディオファイルを着信音として設定する

(質問を重複としてマークする方法がわかりません)

于 2012-07-01T11:33:51.673 に答える
0

私にとっては、最初は機能しませんが、2回目以降は機能します

Uri ruri = Uri.parse("content://media/internal/audio/media/37");

try 

{

RingtoneManager.setActualDefaultRingtoneUri(context,RingtoneManager.TYPE_RINGTONE,     
ruri);

}

catch (Throwable t) 

{

// error handling goes here -- also, use something other than Throwable

}

AudioManager audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

for (int volumeType: (new int[] { AudioManager.STREAM_SYSTEM,

AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION, AudioManager.STREAM_ALARM   
}))

{

int maxVolume = audio.getStreamMaxVolume(volumeType);


audio.setStreamVolume(volumeType, maxVolume,AudioManager.FLAG_PLAY_SOUND |     
AudioManager.FLAG_VIBRATE);

audio.setStreamMute(volumeType, false);

 audio.setVibrateSetting(volumeType,AudioManager.VIBRATE_SETTING_ON);

 }

 }

 catch (Exception e) 
 {

 // TODO: handle exception

 }

 }
于 2012-09-05T04:37:20.653 に答える