联系Ringtone没有在Cordova for Android中设置

时间:2017-01-16 21:21:39

标签: android cordova phonegap-plugins cordova-plugins android-contacts

我正在寻找使用Cordova / 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;
    }
}

基本上,我使用以下插件来获取联系人数据和铃声路径:

科尔多瓦-插件触点 科尔多瓦-插件-RingtoneSelector

获得联系人ID和铃声路径后,我将它们作为参数发送到我的自定义插件。联系人ID示例为" 1"。铃声路径示例是" content:// media / internal / audio / media / 34"。

我没有看到任何错误返回,成功回调正确地从Java函数返回数据,所以我假设我没有正确查询。

我对Java很新,所以这段代码变得一团糟。在上面的代码中需要更新什么才能正确设置联系人的铃声?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我在这里找到的问题很少:

  1. 在Android上,contact-id是Long而不是Integer,因此Integer.parseInt(contact_id)错误。
  2. CommonDataKinds.Phone._ID不是联系ID,它是电话号码数据行的ID,因此selection错误。
  3. new File(ringtone_path)确保您有权访问此路径,特别是如果您在Marshmallow +设备上使用运行时权限。
  4. Data.RAW_CONTACT_IDRawContact的ID,而不是Contact
  5. 以下是应该运行的联系人更新代码的一部分:

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