首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在contact上设置custom_ringtone可以在一些android手机上工作,而其他的则不起作用。

在contact上设置custom_ringtone可以在一些android手机上工作,而其他的则不起作用。
EN

Stack Overflow用户
提问于 2019-03-12 17:26:34
回答 1查看 142关注 0票数 0

问题是,在小米手机Android8.0上,联系人被分配了一个铃声,但在三星手机上却没有相同的android版本。在这两款手机中,都会显示铃声设置成功,但当我拨打小米手机时,铃声被改变,但当我打三星手机时,铃声是默认的。

以下是相关代码:

AndroidManifest.xml

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

RingtoneActivity.java

当用户点击按钮设置联系人铃声时,会调用setRingtoneContact。

代码语言:javascript
复制
static  final int PICK_CONTACT=1;

public void setRingtoneContact(String pathString){

    // contact_selected_ringtone is a global variable
    contact_selected_ringtone = pathString;

    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT);

}

用户选择一个联系人,我们在onActivityResult中接收结果。

代码语言:javascript
复制
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT) {
        String phoneNo = null;
        String name = null;

        Uri uri = data.getData();
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);

        if (cursor.moveToFirst()) {
            int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);

            phoneNo = cursor.getString(phoneIndex);
            name = cursor.getString(nameIndex);

            Log.e("onActivityResult()", phoneIndex + " " + phoneNo + " " + nameIndex + " " + name);

            setForContact(phoneNo);

        }
        cursor.close();
    }
}

这是一个函数,它实际上为联系人设置了custom_ringtone。

代码语言:javascript
复制
public void setForContact(String contact){
    // The Uri used to look up a contact by phone number
    final Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, contact);
    // The columns used for `Contacts.getLookupUri`
    final String[] projection = new String[] {
            ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY
    };

    final Cursor data = getContentResolver().query(lookupUri, projection, null, null, null);
    data.moveToFirst();
    try {
        // Get the contact lookup Uri
        final long contactId = data.getLong(0);
        final String lookupKey = data.getString(1);
        final Uri contactUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
        if (contactUri == null) {
            // Invalid arguments
            return;
        }
        final File file = new File(contact_selected_ringtone);
        if (file.exists()){
            final String value = Uri.fromFile(file).toString();

            final ContentValues values = new ContentValues(1);
            values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, value);
            try {
                int rows = getContentResolver().update(contactUri, values, null, null);
                if (rows > 0) {
                    Toasty.info(getApplicationContext(),getResources().getString(R.string.ringtone_contact_success),Toast.LENGTH_LONG).show();
                }
            } catch (NullPointerException ex) {
                Log.e("contact_exception", ex.toString());
            }

        }else{
            Toast.makeText(this, "file not exist", Toast.LENGTH_SHORT).show();
        }
    } finally {

        data.close();
    }
}

我们已经研究这个问题两天了,我们到处都在研究这个问题。还有一些关于堆叠溢出的问题,它们也在做同样的事情。这个解决方案有效,但并不适用于所有的手机。希望能找到解决办法。

这是我关于堆栈溢出的第一个问题,如果我没有遵循指导原则,请指导我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 18:08:18

我解决了这个问题。我在这里张贴解决方案。

我在RingtoneActivity.java.中更改了setForContact函数下面是代码:

代码语言:javascript
复制
public void setForContact(String contact){
    // Create File object for the specified ring tone path
    // contact_selected_ringtone is a global variable which has the full path to ringtone
    File f=new File(contact_selected_ringtone);

    // Insert the ring tone to the content provider
    ContentValues content_value=new ContentValues();
    content_value.put(MediaStore.MediaColumns.DATA, f.getAbsolutePath());
    content_value.put(MediaStore.MediaColumns.TITLE, f.getName());
    content_value.put(MediaStore.MediaColumns.SIZE, f.length());
    content_value.put(MediaStore.MediaColumns.MIME_TYPE,"audio/mp3");
    content_value.put(MediaStore.Audio.Media.ARTIST, getString(R.string.app_name));
    content_value.put(MediaStore.Audio.Media.IS_ALARM, false);
    content_value.put(MediaStore.Audio.Media.IS_MUSIC, false);
    content_value.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
    content_value.put(MediaStore.Audio.Media.IS_RINGTONE, true);

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(f.getAbsolutePath());
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + f.getAbsolutePath() + "\"", null);

    Uri newUri = getContentResolver().insert(uri, content_value);

    // The Uri used to look up a contact by phone number
    final Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, contact);

    final String[] projection = new String[] {
            ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY
    };

    final Cursor data = getContentResolver().query(lookupUri, projection, null, null, null);
    data.moveToFirst();
    try {
        // Get the contact lookup Uri
        final long contactId = data.getLong(0);
        final String lookupKey = data.getString(1);
        final Uri contactUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
        String str = data.getString(data.getColumnIndexOrThrow("_id"));
        Uri localUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, str);
        if (contactUri == null) {
            // Invalid arguments
            return;
        }

        final File file = new File(contact_selected_ringtone);
        final String value = Uri.fromFile(file).toString();

        // Apply the custom ringtone_app
        final ContentValues values = new ContentValues();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
        values.put(ContactsContract.Data.CUSTOM_RINGTONE, newUri.toString());
        try {
            int rows = getContentResolver().update(localUri, values, null, null);
            if (rows > 0) {
                Toasty.info(getApplicationContext(),getResources().getString(R.string.ringtone_contact_success),Toast.LENGTH_LONG).show();
            }
        } catch (NullPointerException ex) {
            Log.e("contact_exception", ex.toString());
        }

    } finally {
        data.close();
    }
}

希望它能帮到别人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55127408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档