2012-01-27 21 views
5

में कार्रवाई बदल मैं अपने आवेदन शुरू करना चाहते हैं जब वाईफ़ाई पर बारी किया जाएगा, ताकि मैं वाईफ़ाई राज्य के लिए कार्रवाई समारोह बदल पाने की कोशिश, लेकिन यहवाईफ़ाई कनेक्शन एंड्रॉयड

01-27 15:52:10.470: ERROR/AndroidRuntime(11584): java.lang.RuntimeException: Unable to instantiate receiver com.example.WiFiScanReceiver: java.lang.InstantiationException: com.example.WiFiScanReceiver 

दिखा यह मेरा मैनिफ़ेस्ट फ़ाइल

है
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="com.example" android:versionCode="1" android:versionName="1.0"> 
 <application android:icon="@drawable/icon" android:label="@string/app_name" 
   android:theme="@android:style/Theme.Light"> 
   <activity android:name=".WiFiDemo" android:label="@string/app_name"> 
     <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
   </activity> 
   <receiver android:name="com.example.WiFiScanReceiver"> 
     <intent-filter> 
       <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
     </intent-filter> 
   </receiver> 
 </application> 
 <uses-sdk android:minSdkVersion="3" /> 
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission> 
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

i fallow this link मुझे मार्गदर्शन करें कि वाईफाई चालू होने पर मेरी गतिविधि कैसे शुरू करें।

package com.example; 

import java.util.List; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.IntentFilter; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class WiFiDemo extends Activity implements OnClickListener { 
private static final String TAG = "WiFiDemo"; 
WifiManager wifi; 
BroadcastReceiver receiver; 

TextView textStatus; 
Button buttonScan; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 

 // Setup UI 
 textStatus = (TextView) findViewById(R.id.textStatus); 
 buttonScan = (Button) findViewById(R.id.buttonScan); 
 buttonScan.setOnClickListener(this); 

 // Setup WiFi 
 wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

 // Get WiFi status 
 WifiInfo info = wifi.getConnectionInfo(); 
 textStatus.append("\n\nWiFi Status: " + info.toString()); 

 // List available networks 
 List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
 for (WifiConfiguration config : configs) { 
  textStatus.append("\n\n" + config.toString()); 
 } 
  
 // Register Broadcast Receiver 
 if (receiver == null) 
  receiver = new WiFiScanReceiver(this); 

 registerReceiver(receiver, new IntentFilter(
   WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
 Log.d(TAG, "onCreate()"); 
} 

@Override 
public void onStop() { 
 super.onStart(); 
 unregisterReceiver(receiver); 
} 

public void onClick(View view) { 
 Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
   Toast.LENGTH_LONG).show(); 

 if (view.getId() == R.id.buttonScan) { 
  Log.d(TAG, "onClick() wifi.startScan()"); 
  wifi.startScan(); 
 } 
} 

} 

यहाँ

package com.example; 

import java.util.List; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.ScanResult; 
import android.net.wifi.WifiManager; 
import android.util.Log; 
import android.widget.Toast; 

public class WiFiScanReceiver extends BroadcastReceiver { 
 private static final String TAG = "WiFiScanReceiver"; 
 WiFiDemo wifiDemo; 

 public WiFiScanReceiver(WiFiDemo wifiDemo) { 
   super(); 
   this.wifiDemo = wifiDemo; 
 } 

 @Override 
 public void onReceive(Context c, Intent intent) { 
   List<ScanResult> results = wifiDemo.wifi.getScanResults(); 
   ScanResult bestSignal = null; 
final String action = intent.getAction(); 
   if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
  System.out.println("booladsssssssssssssssssssssssssssssss"); 
  
 } 
   for (ScanResult result : results) { 
     if (bestSignal == null 
         || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
       bestSignal = result; 
   } 

   String message = String.format("%s networks found. %s is the strongest.", 
       results.size(), bestSignal.SSID); 
   Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

   Log.d(TAG, "onReceive() message: " + message); 
 } 

} 
+0

कृपया अपनी वाईफाईडेमो गतिविधि का स्रोत पोस्ट करें। मैं अनुमान लगा रहा हूं कि कोई प्रसारण रिसीवर पंजीकृत नहीं है। लेकिन, मैं तब तक नहीं बता सकता जब तक आप स्रोत पोस्ट नहीं करते। :) – Jonathan

+0

@ जोनाथन अब मैं अपना कोड अपडेट करता हूं .. –

+0

धन्यवाद, मैंने एक उत्तर पोस्ट किया है जो बताता है कि आप अपने ब्रॉडकास्ट रिसीवर कार्यान्वयन को अज्ञात वर्ग में ले जाते हैं। फिर आपको WiFiDemo गतिविधि के संदर्भ को पारित करने के बारे में चिंता करने की आवश्यकता नहीं होगी। – Jonathan

उत्तर

2

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

अद्यतन: मुझे लगता है कि आप प्रसारण रिसीवर कैसे काम करते हैं इस पर थोड़ा उलझन में हैं। वहाँ दो तरीके हैं:

  1. आप एक्सएमएल में यह वर्णन और एंड्रॉयड उदाहरण वस्तु ईवेंट होने पर होगा - इस मामले में आप जैसे एक डिफ़ॉल्ट निर्माता की जरूरत public MyReceiver() {}public MyReceiver(MyObject obj) {}

  2. आप अपने प्रसारण रिसीवर को कोड में पंजीकृत करते हैं। इस प्रकार में कोई कन्स्ट्रक्टर हो सकता है।

तो आपको समस्या हल करने के लिए। बस अपने मैनिफेस्ट में प्रसारण रिसीवर के मंदी को हटा दें।

+0

आपकी टिप्पणी के लिए धन्यवाद, कृपया मुझे कोड के माध्यम से समझाएं। अग्रिम धन्यवाद .. –

+0

@ user1105375 ठीक है, अब पूरा कोड और आपके द्वारा अनुसरण किए गए ट्यूटोरियल को पढ़ें। उत्तर अपडेट किया गया। – tidbeck

0

एंड्रॉइड उस कक्षा को तुरंत चालू नहीं कर पाएगा क्योंकि निर्माता को वाईफाईडेमो की आवश्यकता होती है।

क्यों न केवल अपना प्रसारण रिसीवर अनामित करें?

package com.example; 

    import java.util.List; 

    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.IntentFilter; 
    import android.net.wifi.WifiConfiguration; 
    import android.net.wifi.WifiInfo; 
    import android.net.wifi.WifiManager; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class WiFiDemo extends Activity implements OnClickListener { 
    private static final String TAG = "WiFiDemo"; 
    WifiManager wifi; 
    BroadcastReceiver receiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context c, Intent intent) { 
      List<ScanResult> results = wifi.getScanResults(); 
      ScanResult bestSignal = null; 
      final String action = intent.getAction(); 
      if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
       System.out.println("booladsssssssssssssssssssssssssssssss"); 

      } 
      for (ScanResult result : results) { 
       if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
         bestSignal = result; 
      } 

      String message = String.format("%s networks found. %s is the strongest.", 
      results.size(), bestSignal.SSID); 
      Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

      Log.d(TAG, "onReceive() message: " + message); 
     } 

    }; 

    TextView textStatus; 
    Button buttonScan; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Setup UI 
     textStatus = (TextView) findViewById(R.id.textStatus); 
     buttonScan = (Button) findViewById(R.id.buttonScan); 
     buttonScan.setOnClickListener(this); 

     // Setup WiFi 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

     // Get WiFi status 
     WifiInfo info = wifi.getConnectionInfo(); 
     textStatus.append("\n\nWiFi Status: " + info.toString()); 

     // List available networks 
     List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
     for (WifiConfiguration config : configs) { 
     textStatus.append("\n\n" + config.toString()); 
     } 

     // Register Broadcast Receiver   
     registerReceiver(receiver, new IntentFilter(
     WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     Log.d(TAG, "onCreate()"); 
    } 

    @Override 
    public void onStop() { 
     super.onStart(); 
     unregisterReceiver(receiver); 
    } 

    public void onClick(View view) { 
     Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
     Toast.LENGTH_LONG).show(); 

     if (view.getId() == R.id.buttonScan) { 
     Log.d(TAG, "onClick() wifi.startScan()"); 
     wifi.startScan(); 
     } 
    } 

    } 
+0

फिर से एक ही त्रुटि का सामना करें 01-27 18: 03: 26.500: ई/एंड्रॉइड रनटाइम (1 9 04): java.lang.RuntimeException: रिसीवर com.example.WiFiDemo को तुरंत चालू करने में असमर्थ: java.lang.ClassCastException: com.example.WiFiDemo नहीं हो सकता android.content पर डालें। ब्रॉडकास्ट रिसीवर –

+0

लाइन नंबर क्या है? यह एक अलग त्रुटि है, बीटीडब्ल्यू। – Jonathan

+0

त्रुटि मिली, हटाएं: 'अगर (रिसीवर == नल) रिसीवर = नया वाईफाईस्कैन रिसीवर (यह); ' – Jonathan

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