2009-08-13 6 views

答えて

64

最後に、デフォルトの着信音をダウンロードしたものに設定しました。 ダウンロードコードは、デフォルトの着信音として設定するために必要なものだけが、以下に含まれていません。

File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone 

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
values.put(MediaStore.MediaColumns.SIZE, 215454); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "Madonna"); 
values.put(MediaStore.Audio.Media.DURATION, 230); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
values.put(MediaStore.Audio.Media.IS_ALARM, false); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

//Insert it into the database 
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
Uri newUri = this.getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(
    myActivity, 
    RingtoneManager.TYPE_RINGTONE, 
    newUri 
); 

とにかく、私はこのコードが何をしているか完全に理解していません。

着メロマネージャは、新しい着信音として設定するファイルにURIを必要とします。しかし、このuriは "/sdcard/media/ringtones/mysong.mp3"のようなsdcardに直接アクセスすることはできません。それは動作しません!あなたが必要なもの

は のようなものかもしれないファイルの外部ファイルのURIである「/外部/オーディオ/メディア/ 46」

46のthatsので、メディアストアデータベース内の列のIDですまず、sdcardファイルをデータベースに追加する必要があります。

とにかく、mediastoreはどのようにIDを維持していますか?あなたはこの操作を何度もやるので、この数字は本当に高くなる可能性があります。

私は自分のこの行を削除する必要がありますか?問題は、ファイルブラウザを使ってsdcardから直接削除できるので、ファイルの削除を制御することさえできないことがあります。

+0

上記のコードでメディアコンテンツプロバイダと対話するたびに、新しいエントリが作成されます。あなたは生成しているURIを追跡して、再ダウンロードを避けることができ、 'RingtoneManager'にスキップすることができます。 –

+1

この行に 'main'とは何か' Uri newUri = main.getContentResolver()。insert(uri、values); '私は新しいUriをnullにしています。私を助けてください.. –

+0

'main'の代わりに' getApplicationContext() 'を使用しました。それは正しいですか、それ以外に私はこの問題を解決するために何が使えますか? –

3

RingtonePreferenceクラスを組み込むことができます。 AndroidGuysにはhereに関する素晴らしいチュートリアルがあります。

+0

おかげさまで、ありがとうございましたが、RingtonePreferenceを使用すると、*あなたの*アプリケーションで使用する着信音アセットを選択できます。システムの着信音は設定されません。 – CommonsWare

+1

[OK]を私は逃したかもしれませんが、参照は明示的にそれを伝えていません。私は、アプリケーションが着信を処理していない限り、誰かが彼のアプリケーションで着信音をどうするのだろうかと思う。 – russoue

0

このコードはAndroidのMediaアプリケーションから見つかりました。

Settings.System.putString(resolver, 
Settings.System.RINGTONE, ringUri.toString()); 

2
public void setRingtone() { 
    String ringtoneuri = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/ringtone"; 
    File file1 = new File(ringtoneuri); 
    file1.mkdirs(); 
    File newSoundFile = new File(ringtoneuri, "myringtone.mp3"); 


    Uri mUri = Uri.parse("android.resource://globalapps.funnyringtones/raw/sound_two.mp3"); 


    ContentResolver mCr = this.getContentResolver(); 
    AssetFileDescriptor soundFile; 
    try { 
    soundFile = mCr.openAssetFileDescriptor(mUri, "r"); 
    } catch (FileNotFoundException e) { 
    soundFile = 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 (IOException io) { 
    } 

    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); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
    values.put(MediaStore.Audio.Media.IS_ALARM, true); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath()); 
    Uri newUri = mCr.insert(uri, values); 
    try { 
    Uri rUri = RingtoneManager.getValidRingtoneUri(this); 
    if (rUri != null) 
    ringtoneManager.setStopPreviousRingtone(true); 
    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri); 
    Toast.makeText(this, "New Rigntone set", Toast.LENGTH_SHORT).show(); 
    } catch (Throwable t) { 
    Log.e("sanjay in catch", "catch exception"+e.getMessage()); 
    } 

} 
+0

これは、あなたが着メロを置いた生のフォルダから着信音を設定するのに役立ちます。私も –

+0

soundFile = mCr.openAssetFileDescriptor(mUri、 "r"); この行を書いた理由を教えてください。 –

+0

ここにglobalappsとは何ですか? – AndroidHacker

0

これは私が使用したコードです!私はそれが助けてくれることを願っています。
これはlinkです。

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
String path=(exStoragePath +"/media/alarms/"); 

saveas(RingtoneManager.TYPE_RINGTONE); 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,  Uri.parse("file://"+path+filename+".mp3" 
    + Environment.getExternalStorageDirectory()))); 


File k = new File(path, filename); 

ContentValues values = new ContentValues(4); 
long current = System.currentTimeMillis(); 
values.put(MediaStore.MediaColumns.DATA, path + filename ); 
values.put(MediaStore.MediaColumns.TITLE, filename); 
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 

//new 
values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
values.put(MediaStore.Audio.Media.IS_ALARM, true); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    // Insert it into the database 
this.getContentResolver() 
    .insert(MediaStore.Audio.Media.getContentUriForPath(k 
.getAbsolutePath()), values); 

ハッピーコーディング!

0

私はスタックのオーバーフローについて十分な評判がないので解答できません...データベースに直接アクセスせずに重複を避けるために、メディアファイルにオーディオファイルを追加する方法を追加します。 Vidarことで

String[] files = { audioFullPath }; 
    MediaScannerConnection.scanFile(
     getApplicationContext(), 
     files, 
     null, 
     new OnScanCompletedListener() { 
      @Override 
      public void onScanCompleted(String path, Uri uri) { 
       Log.v("myapp", "file " + path + " was scanned seccessfully: " + uri); 
      } 
     } 
    ); 
0

回答が長すぎると、それは、重複したエントリあなたが着信音として曲を設定するたびに追加されます: 溶液はMediaScannerConnectionに基づいており、これは私が使用するコードです。代わりにこれを試してみてください

Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); 
try { 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); 
    } 
catch (Throwable t) { 


        } 
関連する問題