2010-03-13 34 views
6

Làm cách nào để áp dụng nhạc chuông cho chỉ liên lạc đã chọn?Tôi làm cách nào để đặt nhạc chuông cho một liên hệ riêng lẻ trên Android?

Tôi đã tìm thấy cách để đặt nhạc chuông mặc định áp dụng cho tất cả các liên hệ, nhưng đó không phải là mục tiêu của tôi.

Tôi muốn ứng dụng có nút ("Áp dụng nhạc chuông để liên hệ"), khi được nhấp, hãy bắt đầu một activityForResult hiển thị danh sách tất cả địa chỉ liên hệ trên điện thoại. Khi một số liên lạc được chọn, hoạt động liên lạc sẽ đóng và trả về bằng URI cho số liên lạc. Sau đó, ứng dụng cần phải áp dụng nhạc chuông đã chọn cho liên hệ cụ thể đó.

Mã để hiển thị và chọn liên hệ theo hoạt động đã được triển khai và dường như hoạt động trên ứng dụng.

+1

an droid.provider.ContactsContract.ContactOptionsColumns có CUSTOM_RINGTONE cho nhạc chuông URI, vì vậy bạn có thể cập nhật liên hệ đã chọn với CUSTOM_RINGTONE cho nhạc chuông đã chọn – skyman

Trả lời

10

Bạn có thể sử dụng ContactsContract.Contacts có cột CUSTOM_RINGTONE (cột đọc/ghi!) Cho mục đích này.

Uri contactUri; 
ContentValues values = new ContentValues(); 
values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, 
    newRingtoneUri.toString()); 
context.getContentResolver().update(contactUri, values, where, args); 

Ngoài ra, bạn có thể tìm thấy this discussion hữu ích (mã lấy từ đó).

+0

Cảm ơn, Đó là một cuộc thảo luận rất hữu ích. Rất nhiều nhà phát triển thất vọng về việc thiếu tài liệu và ví dụ từ Google. Tôi sẽ thử đoạn mã được dán của bạn. Hy vọng rằng để làm việc trên 1,5 -> 2,1 ... Tại thời điểm hiện tại mã các ứng dụng đang sử dụng chỉ hoạt động cho 1,5 và 1,6, không cho 2,0 hoặc 2,1 ... Ví dụ: nó hoạt động cho Magic, Hero và G1, nhưng không cho DROID hoặc Nexus –

+0

Vidar Vestnes Bạn có thể vui lòng đăng mã cuối cùng để đặt nhạc chuông cho liên hệ hay không. Tôi không chắc chắn cách nhận và cung cấp URL của tệp Âm nhạc cho "ContentValues". – Sourav301

+0

tiện ích nhạc chuông của tôi có nên luôn là ogg hoặc tôi có thể sử dụng phần mở rộng mp3 không? – Glolita

0

Tôi biết điều này là quá muộn, nhưng tôi đang đăng ở đây vì ở trên người ta không làm việc cho tôi

ContentValues values = new ContentValues(); 

    ContentResolver resolver = getContentResolver(); 

    File file = new File(Environment.getExternalStorageDirectory() + "/Test/ArjunMovieTelugu.mp3"); 
    if(file.exists()) { 

     Uri oldUri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
     resolver.delete(oldUri, MediaStore.MediaColumns.DATA + "=\"" + file.getAbsolutePath() + "\"", null); 


     String contact_number = "CONTACT_NUMBER"; 
     Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, contact_number); 

     // The columns used for `Contacts.getLookupUri` 
     String[] projection = new String[]{ 
       ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY 
     }; 

     Cursor data = getContentResolver().query(lookupUri, projection, null, null, null); 

     if (data != null && data.moveToFirst()) { 
      data.moveToFirst(); 
      // Get the contact lookup Uri 
      long contactId = data.getLong(0); 
      String lookupKey = data.getString(1); 
      Uri contactUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 

      values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); 
      values.put(MediaStore.MediaColumns.TITLE, "Beautiful"); 
      values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
      values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 

      Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
      Uri newUri = resolver.insert(uri, values); 

      if(newUri != null){ 
       String uriString = newUri.toString(); 
       values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, uriString); 
       Log.e("Uri String for " + ContactsContract.Contacts.CONTENT_URI, uriString); 
       long updated = resolver.update(contactUri, values,null, null); 

       Toast.makeText(RingtoneChange.this, "Updated : " + updated, Toast.LENGTH_LONG).show(); 
      } 

      data.close(); 
     } 


    } else { 
     Toast.makeText(RingtoneChange.this, "File does not exist", Toast.LENGTH_LONG).show(); 
    } 

Lưu ý: Chúng ta phải thêm điều khoản thời gian chạy cho kẹo dẻo như

int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; 

private boolean checkAndRequestPermissions() { 
int readExternal = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE); 
int writeExternal = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
int readContacts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS); 
int writeContacts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_CONTACTS); 

List<String> listPermissionsNeeded = new ArrayList<>(); 

if (readExternal != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE); 
} 
if (writeExternal != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
} 
if (readContacts != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.READ_CONTACTS); 

} 
if (writeContacts != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.WRITE_CONTACTS); 

} 

if (!listPermissionsNeeded.isEmpty()){ 
    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray 
      (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
    return false; 
} 
return true; 
} 

và cũng bao gồm tất cả các quyền này trong tệp Tệp kê khai là

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
Các vấn đề liên quan