Android 활동 코드에서 새로운 기본 벨소리를 설정하는 방법을 찾으려고합니다.내 활동에서 Android에서 벨소리를 설정하는 방법은 무엇입니까?
나는 이미 bytearray
에 벨소리를 다운로드했습니다.
Android 활동 코드에서 새로운 기본 벨소리를 설정하는 방법을 찾으려고합니다.내 활동에서 Android에서 벨소리를 설정하는 방법은 무엇입니까?
나는 이미 bytearray
에 벨소리를 다운로드했습니다.
마지막으로 나는 기본 벨소리를 내가 다운로드 한 벨소리로 설정할 수있었습니다. 다운로드 코드는 기본 벨소리로 설정하는 데 필요한 것만 아래에 포함되어 있지 않습니다.
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에 직접있을 수 없습니다. 작동하지 않습니다! 당신이 필요로하는 무엇
는 그게 전부, 그래서 "/ 외부/오디오/미디어/46"
46은 미디어 스토어 MediaStore 데이터베이스에 컬럼의 ID입니다 같은 것을 할 수있는 파일의 외부 파일의 URI입니다 왜 sdcard 파일을 먼저 데이터베이스에 추가해야하는지.
어쨌든 mediastore는 어떻게 ID를 유지합니까? 이 숫자는이 작업을 여러 번 수행 할 때 실제로 높아질 수 있습니다.
이 행을 삭제해야합니까? 문제는 파일 브라우저를 사용하여 sdcard에서 직접 삭제할 수 있기 때문에 파일 삭제를 제어 할 수없는 경우도 있습니다.
내장 된 RingtonePreference 클래스를 사용할 수 있습니다. AndroidGuys는 here에 대한 유용한 자습서를 제공합니다.
어를 시도해야하지만, RingtonePreference은 사용자가 * 응용 프로그램이 사용하는 *에 대한 벨소리 자산을 선택할 수 있습니다. 시스템 벨소리를 설정하지 않습니다. – CommonsWare
좋아, 내가 놓칠 수도 있지만 참조가 명시 적으로 말하지 않습니다.앱이 걸려온 전화를 처리하지 않는 한 누군가가 그의 애플리케이션에서 벨소리를 어떻게 처리하는지 궁금합니다. – russoue
Android의 미디어 애플리케이션에서이 코드를 발견했습니다.
Settings.System.putString(resolver,
Settings.System.RINGTONE, ringUri.toString());
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());
}
}
이것은 모든 벨소리를 넣은 Raw 폴더에서 벨소리를 설정하는 데 도움이됩니다. 나 또한 –
soundFile = mCr.openAssetFileDescriptor (mUri, "r"); 이 라인을 작성한 이유는 무엇입니까? –
여기에 globalapps 란 무엇입니까? – AndroidHacker
이것은 내가 사용한 코드입니다! 나는 그것이 도움이되기를 바랍니다.
이것은 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);
해피 코딩!
스택 오버플로에 대한 충분한 평판이 없기 때문에 솔루션에 대한 의견을 말할 수 없습니다. 데이터베이스에 직접 액세스하지 않고 미디어 파일에 오디오 파일을 추가하여 중복을 피하는 방법을 추가하고 싶습니다. 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);
}
}
);
대답이 너무 깁니다과 중복 된 항목이 노래를 벨소리로 설정할 때마다 추가 : 이 솔루션은 MediaScannerConnection을 기반으로, 이것은 내가 사용하는 코드입니다. 대신 당신은 소리 아웃에 대한 감사를이
Uri newUri=Uri.parse("content://media/external/audio/media/"+ID);
try {
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri);
}
catch (Throwable t) {
}
위 코드에서 미디어 콘텐츠 공급자와 상호 작용하면 매번 새로운 항목이 만들어집니다. 생성하고있는 URI를 추적하여 다시 다운로드하지 않아도되고 'RingtoneManager'로 건너 뛸 수 있습니다. –
이 줄의'main'은 무엇입니까? Uri newUri = main.getContentResolver(). insert (uri, values); 제발 도와주세요 .. –
'main' 대신'getApplicationContext()'를 사용했는데이 문제를 해결하는 데 사용할 수있는 것은 무엇입니까? –