Не назначается рингтон на некоторых устройствах

Я использую следующий код для установки мелодии звонка для отдельных контактов

String contact_number = "MOBILE_NUMBER";
        Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, contact_number);

        // The columns used for `Contacts.getLookupUri`
        String[] projection = new String[]{
                ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY
        };

        // Build your Cursor
        Cursor data = getContentResolver().query(lookupUri, projection, null, null, null);

        if (data != null && data.moveToFirst()) {
            data.moveToFirst();
            try {
                // Get the contact lookup Uri
                long contactId = data.getLong(0);
                String lookupKey = data.getString(1);
                Uri contactUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
                if (contactUri == null) {
                    // Invalid arguments
                    return;
                }

                String ringtoneUri = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Test";
                File filePath = new File(ringtoneUri, "Bhar.MP3");

                Log.e("filePath", filePath.toString());

                String value = Uri.fromFile(filePath).toString();

                // Apply the custom ringtone
                ContentValues values = new ContentValues();
                values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
                values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, value);
                getContentResolver().update(contactUri, values, null, null);


            } finally {
                // Don't forget to close your Cursor
                data.close();
            }
        }

этот код работал на большинстве устройств, но он не работает в Samsung j5 (версия Android 6.0.1), и я также проверил в той же версии устройства (например, Moto G3), на этих устройствах он работает нормально.

Примечание.

  1. Я дал все разрешения, связанные с Marshmallow

  2. Когда я назначаю рингтон на мобильный телефон J5. Он назначает имя мелодии для конкретного контакта, но не воспроизводит назначенную мелодию. Для понимания проверьте прикрепленное изображение

введите здесь описание изображения


person Bahu    schedule 06.10.2016    source источник


Ответы (1)


После этого вопроса я попытался проверить URI мультимедиа вместо URI файла. Похоже, что некоторые (или даже большинство) устройств не любят устанавливать фактический файл без предварительного создания записи мультимедиа рингтона для файла.

Вот мой код «загрузки мелодии», который работает на всех, за которым следует код, который не работает на некоторых:

URLConnection cn = новый URL(mediaUrl).openConnection();

        cn.connect();
        InputStream stream = cn.getInputStream();

        final File dir = new File(Environment.getExternalStorageDirectory().toString() + donloadedFilesDir);
        dir.mkdirs(); //create folders where write files
        final File file = new File(dir, getFileName(mediaUrl));

        FileOutputStream out = new FileOutputStream(file);
        byte buffer[] = new byte[1024];
        int dataSize;
        while ((dataSize = stream.read(buffer)) != -1) {
            out.write(buffer, 0, dataSize);
        }

        stream.close();
        out.flush();
        out.close();
        //Getting the file again to have the size after write
        File k = new File(dir, getFileName(mediaUrl));

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, "vCallRingtone");
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/" + getFileExtention(mediaUrl));
        values.put(MediaStore.MediaColumns.SIZE, k.length());
        values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
        values.put(MediaStore.Audio.Media.IS_ALARM, true);
        values.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
        context.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
        Uri newUri = context.getContentResolver().insert(uri, values);

        return newUri.toString();

А вот старый код, который не работал:

URLConnection cn = new URL(mediaUrl).openConnection();

        cn.connect();
        InputStream stream = cn.getInputStream();

        final File dir = new File(Environment.getExternalStorageDirectory().toString() + donloadedFilesDir);
        dir.mkdirs(); //create folders where write files
        final File file = new File(dir, getFileName(mediaUrl));

        FileOutputStream out = new FileOutputStream(file);
        byte buffer[] = new byte[1024];
        int dataSize;
        while ((dataSize = stream.read(buffer)) != -1) {
            out.write(buffer, 0, dataSize);
        }

        stream.close();
        out.flush();
        out.close();

        return Uri.fromFile(file).toString();
person Shachar Silbert    schedule 19.02.2017
comment
Спасибо за ваше решение - person Bahu; 20.02.2017
comment
@Bahu Конечно, вы должны отметить это как решение, если оно решило конкретную проблему. - person Shachar Silbert; 22.02.2017