2012-01-07 11 views
28

रीबूट के बाद प्रसारण रिसीवर में एक चेतावनी संवाद दिखाएं शुभ दिन, मैं प्रसारण रिसीवर में सिस्टम रीबूट करने के बाद एक अलर्ट संवाद दिखाने की कोशिश कर रहा हूं। मैंने अपने मैनिफेस्ट में रिसीवर जोड़ा है और आवश्यक अनुमति कहा है, लेकिन संवाद दिखाने में त्रुटि मिल रही है। मैं इस को सही ढंग से लागू कर सकते हैं कैसे करें .. धन्यवादसिस्टम रिबूट

मेरी कोड:

public void onReceive(final Context context, Intent intent) { 
    Log.d(TAG, "received boot completed broadcast receiver... starting settings"); 


    String settings = context.getResources().getString(R.string.restart_setting); 
     String yes = context.getResources().getString(R.string.Settings); 
     String no = context.getResources().getString(R.string.Cancel); 

       final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       builder.setMessage(settings) 
         .setCancelable(false) 
         .setPositiveButton(yes, new DialogInterface.OnClickListener() { 
    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) 
    Intent config = new Intent(context, WeatherConfigure.class) 
    context.startActivity(config); 

    } 
}) 
    .setNegativeButton(no, new DialogInterface.OnClickListener() { 
     public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
      dialog.cancel(); 
     } 
    }); 
    final AlertDialog alert = builder.create(); 
    alert.show(); 

    } 

इस लॉग त्रुटि हो रही है:

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.ViewRoot.setView(ViewRoot.java:548) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.app.Dialog.show(Dialog.java:288) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at com.MuaaApps.MyWeatherUpdate.myWeatherBroadcastReceiver.onReceive(MyWeatherBroadcastReceiver.java:59) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994) 
+0

उपयोगकर्ता को एक चेतावनी संवाद के साथ उपयोगकर्ता को विस्फोट करने के बजाए एक टोस्ट संदेश या अधिसूचना अधिक उपयुक्त हो सकती है क्योंकि उनके फोन चालू होते हैं। – cottonBallPaws

+0

@littleFluffyKitty, हाँ मैं समझता हूं कि आपका क्या मतलब है। मैं सिर्फ यह देखने के लिए विभिन्न परिदृश्यों का प्रयास कर रहा हूं कि मुझे लगता है कि एक अच्छा उपयोगकर्ता अनुभव देगा, लेकिन मुझे आपके द्वारा किए गए अधिसूचना सुझाव को स्वीकार करना एक बहुत ही आकर्षक विकल्प है। उस बारे में सोचा नहीं था। धन्यवाद – irobotxxx

उत्तर

38

समस्या आप से एक AlertDialog दिखाने की कोशिश कर रहे है एक BroadcastReceiver, जिसकी अनुमति नहीं है। आप BroadcastReceiver से AlertDialog नहीं दिखा सकते हैं। केवल गतिविधियां संवाद प्रदर्शित कर सकती हैं।

आपको कुछ और करना चाहिए, BroadcastReceiver बूट पर शुरू करें और संवाद दिखाने के लिए एक गतिविधि शुरू करें।

यहां पर blog post अधिक है।

संपादित करें:

यहाँ कैसे मैं यह कर की सिफारिश करेंगे है। अपने से BroadcastReceiver जैसे एक AlertDialog के साथ एक Activity ..

public class NotifySMSReceived extends Activity 
{ 
    private static final String LOG_TAG = "SMSReceiver"; 
    public static final int NOTIFICATION_ID_RECEIVED = 0x1221; 
    static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     IntentFilter filter = new IntentFilter(ACTION); 
     this.registerReceiver(mReceivedSMSReceiver, filter); 
    } 

    private void displayAlert() 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Are you sure you want to exit?").setCancelable(
      false).setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }).setNegativeButton("No", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 

    private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (ACTION.equals(action)) 
      { 
       //your SMS processing code 
       displayAlert(); 
      } 
     } 
    } 
} 

शुरू आप यहाँ देख जैसा कि मैंने कभी नहीं setContentView() कहा जाता है। ऐसा इसलिए है क्योंकि गतिविधि में एक पारदर्शी दृश्य होगा और केवल अलर्ट संवाद दिखाएगा।

+0

ठीक है। इसे साफ करने के लिए धन्यवाद। तो क्या इसका मतलब है कि प्रसारण रिसीवर से या केवल इस विशेष प्रकार के प्रसारण में एक चेतावनी संवाद बनाना संभव नहीं है? – irobotxxx

+0

मेरा संपादन देखें। –

+0

उस समय के लिए धन्यवाद। बाद में नोटिफिकेशन – irobotxxx

7

यहां एक post है कि इसे कैसे करें। आप here से स्रोत कोड प्राप्त कर सकते हैं।

आप सीधे अपने प्रसारण रिसीवर से संवाद नहीं दिखा सकते हैं। आपको Activity का उपयोग करना होगा। इसके अलावा, ACTION_BOOT_COMPLETED प्राप्त करने के लिए आपकी गतिविधि को पहले उपयोगकर्ता द्वारा या किसी अन्य एप्लिकेशन द्वारा स्पष्ट रूप से प्रारंभ किया जाना चाहिए (Google अनुप्रयोग ने अधिक जानकारी के लिए राज्य को रोक दिया है)।

असल में, आवश्यक कार्यक्षमता को प्राप्त करने के लिए, आप सब करने की ज़रूरत:

  1. पारदर्शी गतिविधि है कि संवाद से पता चलता बनाएँ।
  2. BroadcastReceiver बनाएं जो ACTION_BOOT_COMPLETED प्राप्त करता है और आपकी गतिविधि शुरू करता है।
  3. मैनिफेस्ट में अपने प्रसारण रिसीवर को पंजीकृत करें और उचित अनुमति प्राप्त करें।

इसके अलावा, this प्रश्न पारदर्शी गतिविधि को बनाने के तरीके के बारे में अधिक जानकारी प्रदान करता है।

+0

यह एक महान पोस्ट है। धन्यवाद लेकिन मैं रिसीवर को कमांड प्रॉम्प्ट से ट्रिगर करने के बाद संवाद दिखाना चाहता हूं। इसे कैसे प्राप्त करें, यहां संवाद पहले दिखा रहा है। – AndroidOptimist

+0

जैसा कि मैं समझता हूं, आप अभी भी 'ब्रॉडकास्ट रिसीवर' से संवाद दिखाना चाहते हैं। केवल अंतर यह है कि आपका रिसीवर दूसरे इरादे से ट्रिगर होता है (नहीं 'android.intent.action.BOOT_COMPLETED'), है ना? –

+0

हाँ आप सही हैं। मैंने अपनी त्रुटि को सुधार दिया :-) – AndroidOptimist

26

आप BroadcastReceiver पर संवाद का उपयोग नहीं कर सकते, तो बजाय आप बेहतर BroadcastReceiver से संवाद बॉक्स के लिए एक गतिविधि फोन,

अपने onReceive समारोह में इस कोड जोड़ें:

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Intent i = new Intent(context, {CLASSNAME}.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

भरने संवाद गतिविधि के साथ {} className, heres मेरी संवाद गतिविधि:

package com.example.mbanking; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 


// ALERT DIALOG 
// Sources : http://techblogon.com/alert-dialog-with-edittext-in-android-example-with-source-code/ 

public class AlertDialogActivity extends Activity 
{ 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder 
     .setTitle("Test") 
     .setMessage("Are you sure you want to exit?") 
     .setCancelable(false) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); 
      } 
     }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 
} 

जहाँ मैं इस सवाल का जवाब मिल गया है, यहाँ: How do you use an alert dialog box in a broadcast receiver in android? फेमी के लिए धन्यवाद !!, मैं सिर्फ समाचार फैलता हूं: डी

+0

मैंने कोशिश की लेकिन यह मेरे लिए काम नहीं कर रहा है –

0

यह पुराना हो सकता है और उत्तर दिया गया है, लेकिन उत्तर दिया गया जवाब बिल्कुल उपयोगी नहीं था।

You cannot launch a popup dialog in your implementation of onReceive(). BroadcastReceiver

संवाद या popupWindow के बजाय

, आप एक गतिविधि है जो के रूप में संवाद

<activity 
    android:taskAffinity="" 
    android:name=".activity.CallActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.Dialog" /> 

थीम्ड है उपयोग कर सकते हैं कृपया ध्यान दें कि मैं ब्लॉक के अंदरtaskAffinity जोड़ने (AndroidManifest.xml)

फिर आप इसे नियमित गतिविधियों के रूप में उपयोग कर सकते हैं।

Intent intentPhoneCall = new Intent(context, CallActivity.class); 
intentPhoneCall.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intentPhoneCall); 

उम्मीद है कि यह मदद करता है। हैप्पी कोडिंग।

public class MyAlertDialog extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); //hide activity title 
    setContentView(R.layout.activity_my_alert_dialog); 

    AlertDialog.Builder Builder=new AlertDialog.Builder(this) 
      .setMessage("Do You Want continue ?") 
      .setTitle("exit") 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setNegativeButton(R.string.No, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        MyAlertDialog.this.finish(); 
       } 
      }) 
      .setPositiveButton(R.string.Yes,null); 
    AlertDialog alertDialog=Builder.create(); 
    alertDialog.show(); 

} 

} 

और में:

3

सबसे अच्छा तरीका है एक गतिविधि बनाने के लिए और अपने "थीम" विशेषता के लिए "Theme.Translucen" सेट

<activity 
     android:name=".MyAlertDialog" 
     android:label="@string/title_activity_alert_dialog" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.Translucent" > 
    </activity> 

और अपनी गतिविधि में एक चेतावनी संवाद बनाने के लिए है brodcastreciver:

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent i=new Intent(context.getApplicationContext(),MyAlertDialog.class); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

} 
} 
0
  1. प्रदर्शन Broa से एक संवाद डकास रिसीवर संभव नहीं है।
  2. हमें केवल गतिविधि से संवाद दिखाना चाहिए।
  3. लेकिन आपके एप्लिकेशन संदर्भ में केवल ब्रॉडकास्ट रिसीवर है, तो हमें गतिविधि को "FLAG_ACTIVITY_NEW_TASK" के रूप में लॉन्च करना चाहिए, फिर यह स्टैक बनाता है।
  4. अगर हम इस ध्वज "FLAG_ACTIVITY_NEW_TASK" के साथ गतिविधि लॉन्च करते हैं तो हम ढेर से नहीं हटा सकते हैं।

  5. तो आवेदन बंद करने के बाद, हम स्टैक से एप्लिकेशन को शुरू करने की कोशिश कर रहे हैं, यह वही गतिविधि दिखाता है, क्योंकि इस गतिविधि में ध्वज "FLAG_ACTIVITY_NEW_TASK" है, इसलिए इसे नया उदाहरण नहीं बनाना चाहिए और इसका उपयोग नहीं करना चाहिए मौजूदा उदाहरण

लेकिन हम केवल एक बार संवाद दिखाना चाहते हैं। इसके लिए हमें प्रोग्रामेटिक सहयोगी को संभालने की जरूरत है।

if (count == 0) { 
      mBuilder = new Dialog(this); 
      mMsg = getIntent().getStringExtra(AlarmSchedulerUtils.EXTRA_MSG); 
      Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
      mRingTome = RingtoneManager.getRingtone(ReminderDialog.this, notification); 
      mRingTome.play(); 
      count++; 
      showReminderDialog(); 
     } else { 
      Intent intent=new Intent(ReminderDialog.this,SplashActivity.class); 
      startActivity(intent); 
      finish(); 
     } 

यह मेरे लिए काम किया गया है।

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