Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用声音标题而不是数字位置将声音另存为铃声_Java_Android - Fatal编程技术网

Java 使用声音标题而不是数字位置将声音另存为铃声

Java 使用声音标题而不是数字位置将声音另存为铃声,java,android,Java,Android,我在android上有一个音板应用程序,用户可以长按按钮将声音保存为铃声、通知或警报。一切正常,声音保存到SD卡并设置为默认声音,但声音名称设置为应用程序中的数字位置。例如,如果我保存了第一个声音,它的标题是“笑”,它将保存到SD卡,并显示在铃声列表中为“1”,而不是“笑”。我希望声音与标题一起保存,而不是与编号一起保存 我需要在代码中更改什么来修复此问题??我正在使用数组设置按钮的声音标题等。以下是我保存声音的代码: public boolean setAsTone(int ressound,

我在android上有一个音板应用程序,用户可以长按按钮将声音保存为铃声、通知或警报。一切正常,声音保存到SD卡并设置为默认声音,但声音名称设置为应用程序中的数字位置。例如,如果我保存了第一个声音,它的标题是“笑”,它将保存到SD卡,并显示在铃声列表中为“1”,而不是“笑”。我希望声音与标题一起保存,而不是与编号一起保存

我需要在代码中更改什么来修复此问题??我正在使用数组设置按钮的声音标题等。以下是我保存声音的代码:

public boolean setAsTone(int ressound, String filename, String toneType) {

    Log.v("File Name", "" + filename);
    Log.v("Tone Type", "" + toneType);
    byte[] buffer = null;
    InputStream fIn = getBaseContext().getResources().openRawResource(ressound);
    int size = 0;

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

    }
    if (toneType.contains(getString(R.string.ringtone))) {
        path = "/sdcard/media/audio/"
                + getString(R.string.ringtone).toLowerCase() + "/";
        Log.v("Path", "" + path);
    } else if (toneType.contains(getString(R.string.notification))) {
        path = "/sdcard/media/audio/"
                + getString(R.string.notification).toLowerCase() + "/";
        Log.v("Path", "" + path);
    } else if (toneType.contains(getString(R.string.alarm))) {
        path = "/sdcard/media/audio/"
                + getString(R.string.alarm).toLowerCase() + "/";
        Log.v("Path", "" + path);
    }

    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;
    }

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

    File ringtoneFile = new File(path, filename);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, filename);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");
    values.put(MediaStore.Audio.Media.ARTIST, "Laughing");
    Log.v("getAbsolute Path", "" + ringtoneFile.getAbsolutePath());
    if (toneType.contains(getString(R.string.ringtone))) {
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        type = RingtoneManager.TYPE_RINGTONE;
        Log.v("Ring Type", "" + type);
    } else if (toneType.contains(getString(R.string.notification))) {
        values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        type = RingtoneManager.TYPE_NOTIFICATION;
        Log.v("Ring Type", "" + type);
    } else if (toneType.contains(getString(R.string.alarm))) {
        values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, true);
        type = RingtoneManager.TYPE_ALARM;
        Log.v("Ring Type", "" + type);
    }

    values.put(MediaStore.Audio.Media.IS_MUSIC, true);

    // Insert it into the database
    Uri ringtoneUri = null;
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile
            .getAbsolutePath());
    Log.v("Uri Path",""+uri);
    getContentResolver().delete(
            uri,
            MediaStore.MediaColumns.DATA + "=\""
                    + ringtoneFile.getAbsolutePath() + "\"", null);

    ringtoneUri = this.getContentResolver().insert(uri, values);
    Log.v("Ringtone Uri", "" + ringtoneUri);
    Log.v("Final Ring Type", "" + type);
    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(),
            type, ringtoneUri);
    RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(), type);
    return true;
}
}改变

values.put(MediaStore.MediaColumns.TITLE, filename);

因为TITLE在列表中显示给用户,而filename似乎等于“1”。 希望这会有所帮助。

改变

values.put(MediaStore.MediaColumns.TITLE, filename);

因为TITLE在列表中显示给用户,而filename似乎等于“1”。
希望这会有帮助。

我知道这很旧,但它可能会帮助别人。删除此行,然后它将从ContentValues中选择适当的标题:

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

我相信这是在重新扫描您刚刚创建的文件,并覆盖媒体存储中的条目,在这个过程中删除您的原始内容值。

我知道这是旧的,但它可能会帮助某些人。删除此行,然后它将从ContentValues中选择适当的标题:

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

我相信这是在重新扫描您刚刚创建的文件并覆盖媒体存储中的条目,在此过程中删除您的原始ContentValue。

基本上,我想要的是在设置文件标题的ContentValues代码下,我想要用相应的数组名保存文件,不是MediaStore中的文件名。您从哪里获取文件名?基本上,我想要的是在ContentValues代码下设置文件标题,我希望使用相应的数组名保存文件,而不是从MediaStore获取文件名。您从哪里获取文件名?