Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड एक्टिविटी से रिंगटोन कैसे सेट करें?

एंड्रॉइड में 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: चलाएं और टेस्ट करें

  1. ऐप खोलें → "रिंगटोन चुनें" दबाएं।
  2. सिस्टम रिंगटोन पिकर खुलेगा — एक रिंगटोन चुनें → OK।
  3. चुनी गई रिंगटोन का URI TextView में दिखेगा।
  4. "डिफ़ॉल्ट रिंगटोन के रूप में सेट करें" दबाएं।
  5. Android 10+ पर: सेटिंग्स स्क्रीन खुलेगी → "अनुमति दें" टॉगल ऑन करें → ऐप पर वापस आएं → फिर से बटन दबाएं।
  6. सफलता टोस्ट दिखेगा।

🔑 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() से बजाएं।
  1. एंड्रॉइड में एक्टिविटी से फ्रैगमेंट में वेरिएबल कैसे पास करें? एंड्रॉइड में एक्टिविटी से फ्रैगमेंट में वेरिएबल कैसे पास करें?

    Bundle और setArguments के साथ फ्रैगमेंट को डेटा पास करें यह उदाहरण दर्शाता है कि Bundle का उपयोग करके एक्टिविटी से फ्रैगमेंट में स्ट्रिंग डेटा कैसे पास करें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट में कंटेनर और इनपुट res/layout/activity_main.xml: <?

  1. एंड्रॉइड पर कस्टम टेक्स्ट मैसेज रिंगटोन सेट करें: चरण-दर-चरण गाइड एंड्रॉइड पर कस्टम टेक्स्ट मैसेज रिंगटोन सेट करें: चरण-दर-चरण गाइड

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

  1. एंड्रॉइड पर कस्टम टेक्स्ट मैसेज रिंगटोन: अपने अलर्ट को वैयक्तिकृत करें एंड्रॉइड पर कस्टम टेक्स्ट मैसेज रिंगटोन: अपने अलर्ट को वैयक्तिकृत करें

    क्या आप अपने सभी संपर्कों के लिए एक मानक संदेश अधिसूचना टोन से ऊब गए हैं? क्या आप प्रेषक के अनुसार संदेशों को प्राथमिकता देने में असमर्थ हैं? यदि हां, तो यह गाइड आपके संपर्कों के लिए संदेश अधिसूचना टोन को अनुकूलित करने में आपकी मदद करेगा। बदले में, यह आपको उनमें से प्रत्येक के लिए प्रतिक्रिया समय को