0

私はコルドバ/アンドロイドを使用して連絡先に着信音を設定するためのプラグインを作成しているよのためにコルドバに設定していないが、私はしばらくの間、次のコードをいじりの後に任意の運を持っていなかった。問い合わせ着メロは、Android

コルドバ - プラグインの連絡先 コルドバ - プラグインRingtoneSelector

私は、コンタクトIDと着メロのパスを取得すると:基本的に、私は連絡先データや着信音のパスを取得するには、以下のプラグインを使用してい

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

、私はそれらを私のcに送るustom pluginを引数として使用します。連絡先IDの例は「1」です。着信音のパスの例は "content:// media/internal/audio/media/34"です。

返されたエラーは表示されず、成功コールバックはJava関数からデータを正しく返します。したがって、私は正しく何かを照会していないと仮定しています。

私はかなりJavaに新しいので、このコードは混乱になっています。上記のコードで、連絡先に着信音を正しく設定できるようにするためには、何を更新する必要がありますか?前もって感謝します。

答えて

0

いくつかの問題私はここで見つける:

  1. 接触-idは、Android上でロングではない整数であるので、Integer.parseInt(contact_id)が間違っています。
  2. CommonDataKinds.Phone._IDはcontact-idではありません。電話番号のデータ行のIDなので、selectionは間違っています。
  3. new File(ringtone_path)このパスにアクセスする権限があることを確認してください。特に、Marshmallow +デバイスでランタイムアクセス許可を使用している場合は特に注意してください。
  4. Data.RAW_CONTACT_IDは、RawContactの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); 
} 
関連する問題