将RAW文件夹中的mp3设置为android铃声,通知和闹钟声音

时间:2017-03-14 03:40:26

标签: android notifications mp3 android-6.0-marshmallow ringtone

我的第一个(铃声)应用程序的最后一块,我有一些麻烦,根据一些教程和朋友的一点帮助我想出了一个代码,从RAW文件夹中获取mp3作为Android铃声,通知和警报声。我在模拟器上测试过它有效,但是当我在我的S6edge上测试时没有发生任何事情,有人可以告诉我这个代码可能有什么问题,或者有人能指出我更好的编码解决方案

这是代码:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setSong(this, RingtoneManager.TYPE_RINGTONE, R.raw.test, "TestR");
    setSong(this, RingtoneManager.TYPE_NOTIFICATION, R.raw.test, "TestN");
    setSong(this, RingtoneManager.TYPE_ALARM, R.raw.test, "TestA");
}


/**
 * In this method, we need to copy the mp3 file to the sd card location from
 * where android picks up ringtone files
 * After copying, we make the mp3 as current ringtone
 *
 * @param context
 * @param type
 * @param songId
 * @param ringtoneTitle
 * @return
 */

public static boolean setSong(Context context, int type, int songId, String ringtoneTitle) {
    byte[] buffer = null;
    InputStream fIn = context.getResources().openRawResource(
            songId);
    int size = 0;

    try {
        size = fIn.available();
        buffer = new byte[size];
        fIn.read(buffer);
        fIn.close();
    } catch (IOException e) {
        return false;
    }

    String path = Environment.getExternalStorageDirectory().getPath()
            + "/media/audio/ringtones/";

    String filename = ringtoneTitle + ".mp3";

    boolean exists = (new File(path)).exists();
    if (!exists) {
        new File(path).mkdirs();
    }

    FileOutputStream save;
    try {
        save = new FileOutputStream(path + filename);
        save.write(buffer);
        save.flush();
        save.close();
    } catch (FileNotFoundException e) {
        return false;
    } catch (IOException e) {
        return false;
    }

    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.parse("file://" + path + filename)));

    File k = new File(path, filename);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, ringtoneTitle);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
    values.put(MediaStore.MediaColumns.SIZE, k.length());

    // This method allows to change Notification and Alarm tone also. Just
    // pass corresponding type as parameter
    if (RingtoneManager.TYPE_RINGTONE == type) {
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    } else if (RingtoneManager.TYPE_NOTIFICATION == type) {
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
    } else if (RingtoneManager.TYPE_ALARM == type) {
        values.put(MediaStore.Audio.Media.IS_ALARM, true);
    }

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());

    String selection = MediaStore.MediaColumns.DATA + " =?";
    String[] selectionArgs = {k.getAbsolutePath()};
    Uri newUri = null;

    // Check if record exist
    Cursor c = context.getContentResolver().query(uri, null, selection, selectionArgs, null);
    if (c != null) {
        if (c.getCount() > 0) {
            // Record exist
            // Update record
            while (c.moveToNext()) {
                int idIndex = c.getColumnIndex(MediaStore.Audio.Media._ID);
                int dataIndex = c.getColumnIndex(MediaStore.Audio.Media.DATA);
                String strId = c.getString(idIndex);
                String songPath = c.getString(dataIndex);
                newUri = MediaStore.Audio.Media.getContentUriForPath(songPath);
                String condition = MediaStore.Audio.Media._ID + " =?";
                String[] selectionArg = {strId};
                context.getContentResolver().update(uri, values, condition, selectionArg);
            }

        } else {
            // Record does not exist, create new
            newUri = context.getContentResolver().insert(uri, values);
        }
    }

    if (newUri != null) {
        RingtoneManager.setActualDefaultRingtoneUri(context, type,
                newUri);
        return true;
    }

    return false;
}

}

当然,我获得了权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>`

和原始文件夹中的test.mp3文件

1 个答案:

答案 0 :(得分:0)

  

从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择让相机应用程序访问相机,但不能访问设备位置。用户可以随时转到应用程序的“设置”屏幕来撤消权限。

您需要在应用程序中处理运行时权限。 有关教程,请参阅以下链接。 Runtime Permission in Android