【问题标题】:Setting Ringtone notification from SD card file从 SD 卡文件设置铃声通知
【发布时间】:2011-03-03 01:46:15
【问题描述】:

我的目标是从应用程序中存储在 SD 卡上的文件中设置用户通知声音。我正在使用此代码:

if(path != null){

    File k = new File(path, "moment.mp3");

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, "My Song title");
    values.put(MediaStore.MediaColumns.SIZE, 215454);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
    values.put(MediaStore.Audio.Media.DURATION, 230);
    values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, "Some Name");

    //Insert it into the database
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
    Uri newUri = MainActivity.this.getContentResolver().insert(uri, values);

    RingtoneManager.setActualDefaultRingtoneUri(
      MainActivity.this,
      RingtoneManager.TYPE_NOTIFICATION,
      newUri
    );
    //RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri);
    Toast.makeText(this, "Notification Ringtone Set", Toast.LENGTH_SHORT).show();
}

当我在设备上运行它时,我不断收到错误:

06-12 15:19:36.741: ERROR/Database(2847): Error inserting is_alarm=false is_ringtone=false artist_id=35 is_music=false album_id=-1 title=My Song title duration=230 is_notification=true title_key=%D%\%%P%H%F%8%%R%<%R%B%4% mime_type=audio/mp3 date_added=1276370376 _display_name=moment.mp3 _size=215454 _data=/mnt/sdcard/Android/data/_MY APP PATH_/files/moment.mp3
06-12 15:19:36.741: ERROR/Database(2847): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

我看到其他人使用这种技术,但我找不到任何文档说明实际需要传入哪些值才能将文件成功添加到 Android 系统中,以便将其设置为通知。

【问题讨论】:

    标签: android ringtone mediastore


    【解决方案1】:

    记得将“uses-permission”标签放在AndroidManifest.xml 中,并将android:name 属性设置为android.permission.WRITE_SETTINGS.

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

    【讨论】:

      【解决方案2】:

      Weston 你是在删除条目表单数据库之后添加它会解决这个问题

      删除条目的代码

      getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
      
      Uri newUri = getContentResolver().insert(uri, values);
      

      【讨论】:

      • 感谢“删除”行。
      【解决方案3】:

      更正你的代码:

      if(path != null){
      
      File k = new File(path, "moment.mp3");
      
      ContentValues values = new ContentValues();
      values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
      values.put(MediaStore.MediaColumns.TITLE, "My Song title");
      values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");
      values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
      values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
      values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
      values.put(MediaStore.Audio.Media.IS_ALARM, false);
      values.put(MediaStore.Audio.Media.IS_MUSIC, false);
      
      //Insert it into the database
      Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
      Uri newUri = getContentResolver().insert(uri, values);
      
      RingtoneManager.setActualDefaultRingtoneUri(
        MainActivity.this,
        RingtoneManager.TYPE_NOTIFICATION,
        newUri
      );
      

      记住要小心测试这段代码!它只在第一次真实有效。如果您再次尝试运行相同的代码,您将尝试在 MediaStore 的表中添加一个重复的条目,并且 SQLite 数据库将不允许您,给您同样的错误。您必须重命名文件并添加它的另一个实例,或者进入,删除条目,然后重试。为此,您可以使用 RingDroid。只要确保所有音频都可见,然后搜索您的文件名,然后从那里删除它。或者,您可以查看它们的来源以从表中删除。

      【讨论】:

      • 非常感谢您解决双打问题。当然,当您尝试找出代码并且消息不是很清楚问题是什么时,就会发生这种情况。所以再次感谢拯救我的睡眠;-)
      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多