如何在设置铃声之前清除Mediastore

当我从我的应用程序设置一个铃声工作一次,但再次运行代码时,它会尝试在媒体商店中创建一个重复的条目,这会产生问题。 如果不为每个声音文件创建单独的唯一文件名,我想解决此问题。

我发现这个解决方案在这里发布了答案: 将音频文件设置为铃声 ,我正在尝试用它来修复我的。

当我在下面的代码中尝试它时,我得到两个错误。 一个是SQLiteException,另一个是RuntimeException,它是由squlite错误引起的,它位于Java代码之后。

String TAG = "CFFS"; File dir = new File(Environment.getExternalStorageDirectory()+ "/ringtones"); // Set base DIR where new ringtone will live dir.mkdirs(); // create if directors don't exist File outputFile = new File(dir, "College Fight Song.mp3"); // Define out new output file Uri inURI = null; try { inURI = Uri.parse(getIntent().getStringExtra("com.carboni.fightsongs.FILE_RES_ID")); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "Could not get URI " + e); } // If we didn't parse a good URI then don't execute the code below if (inURI != null) { InputStream in = null; // Get the input stream try { in = new BufferedInputStream(this.getContentResolver().openInputStream(inURI)); } catch (Exception e) { Log.e(TAG, "Exception getting input stream " + e); } // Get the output stream OutputStream out = null; try { out = new FileOutputStream(outputFile); } catch (Exception e) { Log.e(TAG, "Exception getting output stream " + e); } // Again, if we don't have 2 good handles then don't try to read/write them if ((in != null) && (out != null)) { byte[] buf = new byte[1024]; // Define our buffer size int bytesRead = 0; while (bytesRead >= 0) { try { bytesRead = in.read(buf, 0, buf.length); // Read max of 1024 bytes if (bytesRead > 0) out.write(buf); // Write buffer to new file if we got a good read } catch (Exception e) { Log.e(TAG,"Exception reading " + e); e.printStackTrace(); } } } // Close out handles and proceed try { in.close(); out.close(); } catch (Exception e) { Log.e(TAG, "Exception closing streams " + e); } ContentValues v = new ContentValues(); v.put(MediaStore.MediaColumns.DATA, outputFile.getAbsolutePath()); v.put(MediaStore.MediaColumns.TITLE, "College Football Fight Song"); v.put(MediaStore.MediaColumns.SIZE, outputFile.length()); v.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); v.put(MediaStore.Audio.Media.IS_RINGTONE, true); Uri pURI = MediaStore.Audio.Media.getContentUriForPath(outputFile.getAbsolutePath()); // remove entry every time so we don't get duplicate entries and have a problem setting a 2nd time getContentResolver().delete(pURI, MediaStore.MediaColumns.DATA + "\"" + outputFile.getAbsolutePath() + "\"", null); Uri nURI = this.getContentResolver().insert(pURI, v); Log.i(TAG, "Setting ringtone URI to " + nURI); // Set ringtone RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, nURI); Toast.makeText(this, "Ringtone set", Toast.LENGTH_LONG).show(); 

错误:

 09-03 14:16:08.343: ERROR/DatabaseUtils(11968): android.database.sqlite.SQLiteException: near ""/mnt/sdcard/ringtones/College Fight Song.mp3"": syntax error: , while compiling: DELETE FROM audio_meta WHERE _data"/mnt/sdcard/ringtones/College Fight Song.mp3" 

看起来错误就是这一行:

 getContentResolver().delete(pURI, MediaStore.MediaColumns.DATA + "\"" + outputFile.getAbsolutePath() + "=\"", null);