2011-01-05 42 views
16

Tôi đã lưu tệp trong thư mục sdcard/media/audio/ringtone s. Tệp đó sẽ xuất hiện trong danh sách lựa chọn nhạc chuông từ settings/sound/phone Nhạc chuông.đặt tệp âm thanh làm Nhạc chuông

Nhưng tôi muốn đặt tệp đó làm nhạc chuông từ mã của tôi. Đây là mã của tôi.

File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*"); 
    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, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k 
     .getAbsolutePath()); 
    Uri newUri = getApplicationContext().getContentResolver().insert(uri, values); 

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

đây uri Tôi nhận được Nhưng tôi đã newUri = null. Tôi nghĩ đó là lý do tại sao nó không được thiết lập làm nhạc chuông.

Bất kỳ ai biết vấn đề ở đâu? làm cách nào để nhận được newUri thích hợp?

+1

nếu tôi đặt nhạc chuông của tôi trên thư mục nguyên liệu, những gì tôi nên xác định như PATH? :) – Roylee

Trả lời

35

Âm thanh được đặt làm nhạc chuông chỉ một lần, nhưng giải pháp cho vấn đề này là - Nếu bạn đang cố gắng chạy lại mã đó, bạn sẽ chèn mục nhập trùng lặp vào bảng của MediaStore, nhưng cơ sở dữ liệu SQLite sẽ không cho phép bạn. Bạn phải đổi tên tệp của mình và thêm một phiên bản khác của tệp hoặc đi vào, xóa mục nhập và sau đó thử lại. Vì vậy, tôi đã xóa mục nhập đó mọi lúc rồi chèn lại.

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
Uri newUri = getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(activity.this, 
     RingtoneManager.TYPE_RINGTONE, newUri); 
+2

Thiên tài! Cảm ơn, tôi đã tìm kiếm trên tất cả các cú pháp về cách truy vấn đúng cho một bản sao. – Nick

+0

Cảm ơn người đàn ông. Điều đó thật tuyệt. Tôi đã tìm kiếm điều này trong nhiều tuần và bạn biết điều gì. Khối catch bắt ngoại lệ này nhưng biến ngoại lệ là null. Tôi không có đầu mối nào có thể là vấn đề này. Cảm ơn: D – drulabs

+1

-1 cho câu trả lời này vì nó không hoạt động! Thiếu kiểm tra để xóa, vì vậy mã này xung quanh nhận được Uri và làm xóa là mã lười biếng! Câu trả lời chính xác hơn là thu được _ID của phương tiện truyền thông và int nRowsDeleted = getContentResolver(). Delete (Uri.parse (MediaStore.Audio.Media.EXTERNAL_CONTENT_UR‌ I + "/" + _ID), null, null); if (nRowsDeleted> 0) {// delete working} else {// delete failed} – t0mm13b

1
RingtoneManager.setActualDefaultRingtoneUri(
Context, 
RingtoneManager.TYPE_RINGTONE, 
Uri 
.parse("Media file uri")); 

Tôi nghĩ rằng điều này sẽ giải quyết vấn đề về ur.

+2

Tôi không nghĩ bạn có câu hỏi. – drulabs

3

Thay vì xóa các uri chèn trước đó, bạn có thể tái sử dụng nó:

// check if file already exists in MediaStore 
    String[] projection = {MediaStore.Audio.Media._ID}; 
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? "; 
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()}; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null); 
    Uri insertedUri; 
    if (cursor == null || cursor.getCount() < 1) { 
     // not exist, insert into MediaStore 
     ContentValues cv = new ContentValues(); 
     cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath()); 
     cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName()); 
     insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); 
    } else { 
     // already exist 
     cursor.moveToNext(); 
     long id = cursor.getLong(0); 
     insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); 
    } 
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri); 
+0

Điều này có nghĩa là "thay thế" nhạc chuông trước đó? –

Các vấn đề liên quan