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



我的第一个(铃声)应用程序的最后一件作品,我遇到了一些麻烦,基于一些教程,在朋友的一些帮助下,我想出了一个代码,可以从the原始文件夹作为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),用户在应用程序运行时授予应用程序权限,而不是安装应用程序时。此方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户更多地控制了应用程序的功能;例如,用户可以选择使相机应用程序访问相机,但不能进入设备位置。用户可以随时访问App的设置屏幕。

您需要在应用程序中处理运行时许可。请参阅以下链接以获取教程。Android

中的运行时许可

最新更新