首页 > 解决方案 > 如何将软件原始文件夹中的音乐设置为默认闹钟歌曲?

问题描述

我使用以下代码保存音乐并将其选择为闹钟音乐,但它不起作用。问题出在哪里?(文件已保存但未选为铃声)

       holder.btn_alarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int resId = getMusicId(position, ringTonesDao);
            File file = saveMusic(resId);
            setForAlarm(file);
        }
    });

此代码接收软件中的音乐 ID。

   public int getMusicId(int position, RingTonesDao ringTonesDao) {
    long id = ringTonesList.get(position).getId();
    String musicAddress = ringTonesDao.checkMusicAddress(id);
    int resId = context.getResources().getIdentifier(musicAddress, "raw", context.getPackageName());
    return resId;
}

此代码在收到音乐 ID 后,将其保存在手机内部存储器中,并将保存的文件作为方法的输出返回。

 public File saveMusic(int resId) {
    File dir;
    String folderName = "Ringtones";
    if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
        dir = new File(Environment.getExternalStorageDirectory(), folderName);
    } else {
        dir = context.getCacheDir();
    }
    if (!dir.exists()) {
        dir.mkdirs();
    }
    File file = new File(dir, resId + ".mp3");
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
        }
        try {
            InputStream inputStream = context.getResources().openRawResource(resId);
            OutputStream outputStream = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }
            outputStream.flush();
            outputStream.close();
            inputStream.close();
        } catch (Exception e) {
            Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
    return file;
}

此代码接收文件并将其设置为警报歌曲。

public void setForAlarm(File file) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, "alarm" + file.getName());
    values.put(MediaStore.MediaColumns.SIZE, file.length());
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
    values.put(MediaStore.Audio.Media.DURATION, 230);
    values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
    values.put(MediaStore.Audio.Media.IS_ALARM, true);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath());
    Uri newUri = context.getContentResolver().insert(uri, values);

    String[] columns = {MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.IS_ALARM
    };
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, MediaStore.Audio.Media.DATA + " = '" + file.getAbsolutePath() + "'", null, null);
    if (cursor != null) {
        int idColumn = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
        int fileColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
        int ringtoneColumn = cursor.getColumnIndex(MediaStore.Audio.Media.IS_ALARM);
        while (cursor.moveToNext()) {
            String audioFilePath = cursor.getString(fileColumn);
            if (cursor.getString(ringtoneColumn) != null && cursor.getString(ringtoneColumn).equals("1")) {
                Uri hasUri = MediaStore.Audio.Media.getContentUriForPath(audioFilePath);
                newUri = Uri.withAppendedPath(hasUri, cursor.getString(idColumn));
            }
        }
        cursor.close();
    }
    RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, newUri);
}

标签: androidfilealarmmanagermediastore

解决方案


推荐阅读