繁体   English   中英

将RAW文件夹中的mp3设置为Android铃声,通知和警报声音

[英]Setting mp3 from RAW folder as a android ringtone, notification and alarm sound

我的第一个(铃声)应用程序的最后一部分,在一些教程的基础上,在朋友的一点帮助下,我遇到了一些麻烦,我想出了一个代码,可以将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文件

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

您将需要在应用程序中处理运行时权限。 请参考以下链接以获取教程。 Android中的运行时权限

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM