2011-01-05 20 views
16

के रूप में ऑडियो फ़ाइल सेट करना मैंने sdcard/media/audio/ringtone एस फ़ोल्डर में फ़ाइल को सहेज लिया है। वह फ़ाइल settings/sound/phone रिंगटोन से रिंगटोन चयन की सूची में दिखाई देगी।रिंगटोन

लेकिन मैं उस फ़ाइल को अपने कोड से रिंगटोन के रूप में सेट करना चाहता हूं। यहां मेरा कोड है।

File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*"); 
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
    values.put(MediaStore.Audio.Media.IS_ALARM, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k 
     .getAbsolutePath()); 
    Uri newUri = getApplicationContext().getContentResolver().insert(uri, values); 

    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), 
     RingtoneManager.TYPE_RINGTONE, newUri); 
यहाँ

uri मैं हो रही है लेकिन मैं newUri = null मिला है। मुझे लगता है कि यही कारण है कि यह रिंगटोन के रूप में स्थापित नहीं है।

कोई भी जानता है कि समस्या कहां है? मैं newUri कैसे प्राप्त करूं?

+1

अगर मैं कच्चे फ़ोल्डर पर मेरी रिंगटोन शब्दों में कहें, मैं पथ के रूप में क्या निर्दिष्ट करना चाहिए? :) – Roylee

उत्तर

35

ऑडियो केवल एक बार रिंगटोन के रूप में सेट किया गया है, लेकिन इस समस्या का समाधान है - यदि आप एक ही कोड को फिर से चलाने की कोशिश कर रहे हैं, तो आप MediaStore की तालिका में डुप्लिकेट प्रविष्टि डालेंगे, लेकिन SQLite डेटाबेस अनुमति नहीं देगा आप। आपको या तो अपनी फ़ाइल का नाम बदलना होगा और इसका एक और उदाहरण जोड़ना होगा, या अंदर जाना होगा, प्रविष्टि को हटा दें, और फिर पुन: प्रयास करें। तो मैंने हर बार उस प्रविष्टि को हटा दिया और फिर इसे फिर से डाला।

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

RingtoneManager.setActualDefaultRingtoneUri(activity.this, 
     RingtoneManager.TYPE_RINGTONE, newUri); 
+2

जीनियस! धन्यवाद, मैं सिंटैक्स के लिए पूरी तरह से एक डुप्लिकेट के लिए पूछताछ के तरीके पर खोज कर रहा हूं। – Nick

+0

धन्यवाद आदमी। वह महान था। मैं इसे हफ्तों के लिए देख रहा था और आप जानते हैं कि क्या। पकड़ ब्लॉक इस अपवाद को पकड़ता है लेकिन अपवाद चर शून्य है। मुझे कोई संकेत नहीं था कि यह मुद्दा हो सकता है। धन्यवाद: इस उत्तर के लिए डी – drulabs

+1

-1 क्योंकि यह काम नहीं करता है! हटाने के लिए जांच की कमी, इसलिए यूरी प्राप्त करने और हटाने के आसपास यह कोड आलसी कोड है! मीडिया का _ID और यह int nRowsDeleted = getContentResolver() प्राप्त करने के लिए और अधिक सही उत्तर होगा। हटाएं (Uri.parse (MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I + "/" + _ID), शून्य, शून्य); अगर (nRowsDeleted> 0) {// हटाएं काम} अन्य {// हटाएं विफल} – t0mm13b

1
RingtoneManager.setActualDefaultRingtoneUri(
Context, 
RingtoneManager.TYPE_RINGTONE, 
Uri 
.parse("Media file uri")); 

मुझे लगता है कि यह आपकी समस्या का समाधान करेगा।

+2

मुझे नहीं लगता कि आपको सवाल मिल गया है। – drulabs

3

पहले से डाला uri हटाने के बजाय, आप इसे पुन: उपयोग कर सकते हैं:

// check if file already exists in MediaStore 
    String[] projection = {MediaStore.Audio.Media._ID}; 
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? "; 
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()}; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null); 
    Uri insertedUri; 
    if (cursor == null || cursor.getCount() < 1) { 
     // not exist, insert into MediaStore 
     ContentValues cv = new ContentValues(); 
     cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath()); 
     cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName()); 
     insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); 
    } else { 
     // already exist 
     cursor.moveToNext(); 
     long id = cursor.getLong(0); 
     insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); 
    } 
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri); 
+0

क्या यह पिछले रिंगटोन को "प्रतिस्थापित" करने के लिए था? –

संबंधित मुद्दे