0

Cordova/Android를 사용하여 연락처에 벨소리를 설정하기위한 플러그인을 만들려고하는데 다음 코드를 사용하여 잠시 뒤죽박죽을 보내지는 않았습니다.연락처 벨소리가 Android 용 Cordova에서 설정되지 않음

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; 
    } 
} 

기본적으로, 연락처 데이터 및 벨소리 경로를 얻기 위해 다음과 같은 플러그인을 사용하고 있습니다 :

코르도바 - 플러그인 - 연락처를 코르도바 - 플러그인 - RingtoneSelector

나는 접촉 ID 및 벨소리 경로를 일단 , 나는 그들을 내 c에게 보낸다. ustom 플러그인을 인수로 사용하십시오. 연락처 ID 예는 "1"입니다. 벨소리 경로 예제는 "content : // media/internal/audio/media/34"입니다.

반환 된 오류가 표시되지 않고 성공 콜백이 Java 함수의 데이터를 올바르게 반환하므로 올바르게 무언가를 쿼리하지 않는다고 가정합니다.

저는 Java에 상당히 익숙하므로이 코드가 엉망이되고 있습니다. 위 코드에서 연락처로 벨소리를 올바르게 설정하려면 무엇을 업데이트해야합니까? 미리 감사드립니다.

답변

0

몇 가지 문제가 여기 찾을 :

  1. 접촉 ID가 안드로이드에 긴 아닌 정수, 그래서 Integer.parseInt(contact_id)가 잘못된 것입니다.
  2. CommonDataKinds.Phone._ID은 contact-id가 아니며 전화 번호의 데이터 행 ID입니다. 따라서 selection은 잘못되었습니다.
  3. new File(ringtone_path)이 경로에 대한 액세스 권한이 있는지 확인하십시오. 특히 Marshmallow + 기기에 대한 런타임 권한을 사용하는 경우 특히 그렇습니다.
  4. Data.RAW_CONTACT_IDRawContact의 ID이며 Contact이 아닙니다.

    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); 
    } 
    
    : 여기

작동합니다 연락처 업데이트 코드의 일부