एंड्रॉइड में RingtoneManager से रिंगटोन चुनना और सेट करना
एंड्रॉइड में सिस्टम रिंगटोन पिकर लॉन्च करने के लिए RingtoneManager.ACTION_RINGTONE_PICKER इंटेंट उपयोग करें। यूज़र द्वारा चुनी गई रिंगटोन का URI onActivityResult में मिलता है। **नोट:** Android 10+ (API 29) में WRITE_SETTINGS परमिशन से सिस्टम रिंगटोन बदलना प्रतिबंधित है — केवल अपना ऐप-इंटरनल रिंगटोन सेट कर सकते हैं।
चरण 1: नया प्रोजेक्ट बनाएं
Android Studio → File → New → New Project → "Empty Activity" → Finish।
चरण 2: Permissions (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
package="com.example.ringtonedemo">
<!-- Android 10+ में WRITE_SETTINGS स्पेशल परमिशन है, यूज़र को सेटिंग्स में जाकर देनी पड़ती है -->
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.RingtoneDemo">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
चरण 3: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<Button
android:id="@+id/btnPickRingtone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="रिंगटोन चुनें"
android:padding="12dp 24dp"
android:layout_marginBottom="24dp" />
<TextView
android:id="@+id/tvRingtoneUri"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="चुनी गई रिंगटोन: -"
android:textSize="16sp"
android:lineSpacingExtra="4dp" />
<Button
android:id="@+id/btnSetAsDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="डिफ़ॉल्ट रिंगटोन के रूप में सेट करें"
android:padding="12dp 24dp"
android:layout_marginTop="24dp"
android:enabled="false" />
</LinearLayout>
चरण 4: MainActivity.java — रिंगटोन पिकर + सेट करना
package com.example.ringtonedemo;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_RINGTONE = 999;
private static final int REQUEST_WRITE_SETTINGS = 1000;
private Button btnPickRingtone, btnSetAsDefault;
private TextView tvRingtoneUri;
private Uri selectedRingtoneUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPickRingtone = findViewById(R.id.btnPickRingtone);
btnSetAsDefault = findViewById(R.id.btnSetAsDefault);
tvRingtoneUri = findViewById(R.id.tvRingtoneUri);
btnPickRingtone.setOnClickListener(v -> launchRingtonePicker());
btnSetAsDefault.setOnClickListener(v -> setAsDefaultRingtone());
}
private void launchRingtonePicker() {
// वर्तमान डिफ़ॉल्ट रिंगटोन URI प्राप्त करें (पिकर में प्री-सेलेक्ट के लिए)
Uri currentDefault = RingtoneManager.getActualDefaultRingtoneUri(
this, RingtoneManager.TYPE_RINGTONE
);
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "रिंगटोन चुनें");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentDefault);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); // "साइलेंट" विकल्प दिखाएं
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); // "डिफ़ॉल्ट" विकल्प दिखाएं
startActivityForResult(intent, REQUEST_RINGTONE);
}
@SuppressLint("SetTextI18n")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_RINGTONE && resultCode == RESULT_OK) {
selectedRingtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (selectedRingtoneUri != null) {
tvRingtoneUri.setText("चुनी गई रिंगटोन:\n" + selectedRingtoneUri.toString());
btnSetAsDefault.setEnabled(true);
} else {
tvRingtoneUri.setText("कोई रिंगटोन नहीं चुनी गई (साइलेंट/डिफ़ॉल्ट)");
btnSetAsDefault.setEnabled(false);
}
} else if (requestCode == REQUEST_WRITE_SETTINGS) {
// WRITE_SETTINGS परमिशन रिजल्ट
if (Settings.System.canWrite(this)) {
setAsDefaultRingtone();
} else {
Toast.makeText(this, "सेटिंग्स लिखने की अनुमति नहीं दी गई", Toast.LENGTH_SHORT).show();
}
}
}
private void setAsDefaultRingtone() {
if (selectedRingtoneUri == null) {
Toast.makeText(this, "पहले रिंगटोन चुनें", Toast.LENGTH_SHORT).show();
return;
}
// Android 10+ (API 29+) में WRITE_SETTINGS परमिशन चेक करें
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (!Settings.System.canWrite(this)) {
// परमिशन रिक्वेस्ट करें (सेटिंग्स स्क्रीन खुलती है)
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_WRITE_SETTINGS);
return;
}
}
try {
// सिस्टम डिफ़ॉल्ट रिंगटोन सेट करें
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
selectedRingtoneUri
);
Toast.makeText(this, "✅ डिफ़ॉल्ट रिंगटोन सेट हो गई!", Toast.LENGTH_LONG).show();
} catch (SecurityException e) {
e.printStackTrace();
Toast.makeText(this, "❌ अनुमति नहीं: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
चरण 5: चलाएं और टेस्ट करें
- ऐप खोलें → "रिंगटोन चुनें" दबाएं।
- सिस्टम रिंगटोन पिकर खुलेगा — एक रिंगटोन चुनें → OK।
- चुनी गई रिंगटोन का URI TextView में दिखेगा।
- "डिफ़ॉल्ट रिंगटोन के रूप में सेट करें" दबाएं।
- Android 10+ पर: सेटिंग्स स्क्रीन खुलेगी → "अनुमति दें" टॉगल ऑन करें → ऐप पर वापस आएं → फिर से बटन दबाएं।
- सफलता टोस्ट दिखेगा।
🔑 RingtoneManager के मुख्य टाइप्स
| कांस्टेंट | उपयोग |
|---|---|
TYPE_RINGTONE | इनकमिंग कॉल रिंगटोन |
TYPE_NOTIFICATION | नोटिफिकेशन साउंड |
TYPE_ALARM | अलार्म टोन |
TYPE_ALL | सभी टाइप्स दिखाएं |
🎵 रिंगटोन बजाकर टेस्ट करना
// रिंगटोन URI से बजाएं Ringtone ringtone = RingtoneManager.getRingtone(this, selectedRingtoneUri); ringtone.play(); // रोकने के लिए ringtone.stop();
⚠️ Android 10+ (API 29+) प्रतिबंध
Settings.System.putString()याRingtoneManager.setActualDefaultRingtoneUri()से **सिस्टम-वाइड** रिंगटोन बदलने के लिएWRITE_SETTINGSपरमिशन चाहिए।- यह **इंस्टॉल-टाइम** नहीं, **रनटाइम स्पेशल परमिशन** है — यूज़र को
Settings.ACTION_MANAGE_WRITE_SETTINGSस्क्रीन पर जाकर मैन्युअली देनी पड़ती है। - अधिकांश ऐप्स को **सिस्टम रिंगटोन बदलने की जरूरत नहीं** — अपने ऐप के नोटिफिकेशन/अलार्म के लिए चुनी गई URI स्टोर करें और
RingtoneManager.getRingtone(context, uri).play()से बजाएं।
💡 ऐप-इंटरनल रिंगटोन स्टोर करना (SharedPreferences)
// सेव करें
prefs.edit().putString("custom_ringtone_uri", selectedRingtoneUri.toString()).apply();
// लोड करें और बजाएं
String uriString = prefs.getString("custom_ringtone_uri", null);
if (uriString != null) {
Uri uri = Uri.parse(uriString);
RingtoneManager.getRingtone(this, uri).play();
}
सारांश
- ✅
RingtoneManager.ACTION_RINGTONE_PICKERइंटेंट से सिस्टम पिकर लॉन्च करें। - ✅
onActivityResultमेंEXTRA_RINGTONE_PICKED_URIसे URI प्राप्त करें। - ⚠️ **सिस्टम डिफ़ॉल्ट रिंगटोन सेट करना** Android 10+ पर
WRITE_SETTINGSस्पेशल परमिशन मांगता है। - 💡 **बेहतर दृष्टिकोण**: यूज़र की पसंद अपने ऐप में स्टोर करें और जरूरत पड़ने पर बजाएं — सिस्टम सेटिंग्स बदलने की जरूरत नहीं।
- 🎵
RingtoneManager.getRingtone(context, uri).play()से बजाएं।