0

Je cherche à créer un plugin pour la configuration de sonneries à des contacts en utilisant Cordova/Android, mais je n'ai pas eu de chance après avoir déconné avec le code suivant pendant un moment:Sonnerie de contact pas de réglage dans Cordova pour Android

package com.mypackage.contactringtone; 

import android.provider.ContactsContract; 
import android.provider.ContactsContract.Contacts; 
import android.provider.ContactsContract.PhoneLookup; 
import android.provider.ContactsContract.CommonDataKinds; 
import android.provider.ContactsContract.CommonDataKinds.*; 
import org.apache.cordova.CordovaPlugin; 
import org.apache.cordova.CallbackContext; 
import org.apache.cordova.LOG; 
import org.json.JSONArray; 
import org.json.JSONException; 
import java.lang.Object; 
import android.net.Uri; 
import java.io.File; 
import android.content.Context; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.provider.MediaStore; 

public class ContactRingtone extends CordovaPlugin { 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
     if ("set_ringtone".equals(action)) { 
      String contact_id = args.getString(0); 
      String phone_number = args.getString(1); 
      String ringtone_path = args.getString(2); 

      int my_contact_id = Integer.parseInt(contact_id); 

     Context context = cordova.getActivity(); 
      Uri contact_data = ContactsContract.Contacts.CONTENT_URI; 
      File ringtone_file = new File(ringtone_path); 

      String[] projection = new String[] { 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.HAS_PHONE_NUMBER 
      }; 

      String selection = ContactsContract.CommonDataKinds.Phone._ID + "='" + my_contact_id + "'"; 

      Cursor local_cursor = context.getContentResolver().query(contact_data, projection, selection, null, null); 
      local_cursor.move(1); 

      String this_id = local_cursor.getString(local_cursor.getColumnIndexOrThrow("_id")); 
      Uri local_uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, this_id); 
      ContentValues local_content_values = new ContentValues(); 

      local_content_values.put(ContactsContract.Data.RAW_CONTACT_ID, my_contact_id); 
      local_content_values.put(ContactsContract.Data.CUSTOM_RINGTONE, ringtone_file.getAbsolutePath() + "/" + contact_id + ".ogg"); 
      context.getContentResolver().update(local_uri, local_content_values, null, null); 

      callbackContext.success("Ringtone set for: " + my_contact_id + " - " + phone_number + " - " + ringtone_path); 
      return true; 
     } 

     callbackContext.error("Invalid action: " + action); 
     return false; 
    } 
} 

Fondamentalement, j'utilise les plug-ins suivants pour obtenir des données de contact et le chemin de la sonnerie:

cordova-plugin-contacts cordova-plugin-RingtoneSelector

Une fois que je reçois l'ID de contact et le chemin sonnerie , Je les envoie à mon c ustom plugin comme arguments. L'exemple d'ID de contact est "1". L'exemple du chemin de la sonnerie est "content: // media/internal/audio/media/34".

Je ne vois aucune erreur renvoyée et le callback de succès renvoie les données de la fonction Java correctement, donc je suppose que je ne demande juste pas quelque chose correctement. Je suis assez nouveau à Java, donc ce code devient un gâchis. Qu'est-ce qui doit être mis à jour dans le code ci-dessus pour pouvoir définir correctement une sonnerie pour un contact? Merci d'avance.

Répondre

0

Peu de questions que je trouve ici:

  1. contact id est un long pas un entier sur Android, donc Integer.parseInt(contact_id) est faux.
  2. CommonDataKinds.Phone._ID n'est pas l'ID de contact, c'est l'ID de la ligne de données d'un numéro de téléphone, donc selection est erroné.
  3. new File(ringtone_path) assurez-vous que vous avez l'autorisation d'accéder à ce chemin, en particulier si vous utilisez des autorisations d'exécution sur les appareils Marshmallow +.
  4. Data.RAW_CONTACT_ID est l'ID d'un RawContact, et non de Contact.

est ici la partie du code de mise à jour des contacts qui devrait fonctionner:

Long myContactId = Long.parseLong(contact_id); 
final String ringtoneUri = Uri.fromFile(ringtone_file).toString(); 

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI) 
     .withSelection(ContactsContract.Contacts._ID + " = '" + myContactId + "'") 
     .withValue(ContactsContract.Contacts.CUSTOM_RINGTONE, ringtoneUri) 
     .build()); 

try { 
    resolver.applyBatch(ContactsContract.AUTHORITY, ops); 
}