簡體   English   中英

java.lang.runtimeexception無法實例化接收器

[英]java.lang.runtimeexception unable to instantiate receiver

我正在開發一個掃描燈塔的應用程序。 當應用程序掃描信標時,應用程序將更改接收BR(BroadcastReceiver)消息的UI文本。

應用程序啟動后,如果單擊“按鈕”,則啟動服務。 如果掃描信標,活動類從服務類接收BR消息,並且更改Ui文本。 但是一個或兩秒鍾后的應用程序將關閉並顯示錯誤日志。


代碼:MainActivity.java

public class MainActivity extends Activity {
Button start;
TextView text;
private final String SERVER_ADDRESS = "";
Handler handler;
BeaconReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    start = (Button) findViewById(R.id.start);
    text = (TextView)findViewById(R.id.text);
    receiver = new BeaconReceiver();
    IntentFilter filter = new IntentFilter("com.example.beaconTEST.TEST");
    registerReceiver(receiver, filter);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    phpconnect();
    start.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent;
            intent = new Intent(MainActivity.this, BeaconService.class);
            startService(intent);
        }
    });
}
private class BeaconReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
            Log.i("receive", "success");
            String result = intent.getStringExtra("result");
            text.setText(result);
    }

}

public void phpconnect(){
    runOnUiThread(new Runnable() {
        @Override public void run() {
            try{                        
                URL url = new URL(SERVER_ADDRESS + "/Beacon_Infor.php?");
                Log.i("url","url : "+url);
                url.openStream();
                Log.i("stream","success");
            }catch(Exception e){
                Log.e("Error", "Error : " + e.getMessage());
            }   

        }       
    });

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void onDestroy() {
    super.onDestroy();
    Intent intent;
    intent = new Intent(MainActivity.this, BeaconService.class);
    stopService(intent);
}

}

代碼:BeaconService.java

public class BeaconService extends Service {
CentralManager centralManager;
Handler handler;
Thread t;   
String result;
int count=0;
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
public void onCreate(){
    super.onCreate();
    setCentralManager();
    handler = new Handler(Looper.getMainLooper());
    t = new Thread(new Runnable() { 
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    centralManager.startScanning();
                }
            });
        }
    });
    Log.i("Service", "Start");
    Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show();
    XmlParser xmlGetter = new XmlParser();
    result = xmlGetter.getXmlData("result.xml", "uuid");
    Log.i("Beacon", "name : " + result );
}
public void onDestroy(){
    Toast.makeText(this, "Service End", Toast.LENGTH_SHORT).show();
    if(centralManager.isScanning()) {
        centralManager.stopScanning();
    }
    centralManager.close();
    super.onDestroy();
}
public int onStartCommand(Intent intent, int flags, int startId){
    Log.i("onStartCommand", "Start");
    t.start();
    return START_STICKY;
}

public void setCentralManager() {
    centralManager = CentralManager.getInstance();
    centralManager.init(getApplicationContext());
    centralManager.setPeripheralScanListener(new PeripheralScanListener() {         
        @Override
        public void onPeripheralScan(Central central, final Peripheral peripheral) {
            if(result.equals(peripheral.getProximityUUID()))
            {
                Log.i("count","count : "+ count);
                if(count ==0)
                {
                Log.i("uuid", "result : "+result);
                Intent resultIntent = new Intent("com.example.beaconTEST.TEST");
                resultIntent.putExtra("result", result);
                //sendBroadcast(resultIntent);
                count++;
                }


            }
        }           
    });
}

}

AndroidManifest.xml中

<receiver android:exported="false" android:name="com.example.beaconTest.BeaconReceiver">
        <intent-filter >
            <action android:name="com.example.beaconTEST.TEST"/>
        </intent-filter>
    </receiver>
    <service android:name="com.example.becaontest.BeaconService">
    </service>

LOG

enter code here03-30 20:25:22.088: I/ViewRootImpl(22750): ViewRoot's Touch   
               Event : Touch Down
               03-30 20:25:22.148: I/ViewRootImpl(22750): ViewRoot's Touch Event : Touch UP
               03-30 20:25:22.178: I/Service(22750): Start
               03-30 20:25:22.218: I/Beacon(22750): name : d5756247-57a2-4344-915d-9599497940a7
               03-30 20:25:22.218: I/onStartCommand(22750): Start
               03-30 20:25:22.258: D/BluetoothAdapter(22750): stopLeScan()
               03-30 20:25:22.258: D/BluetoothAdapter(22750): startLeScan(): null
               03-30 20:25:22.258: D/BluetoothAdapter(22750): onClientRegistered() - status=0 clientIf=6
               03-30 20:25:23.268: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-88
               03-30 20:25:23.278: I/count(22750): count : 0
               03-30 20:25:23.278: I/uuid(22750): result : d5756247-57a2-4344-915d-9599497940a7
               03-30 20:25:23.278: I/receive(22750): success
               03-30 20:25:23.278: I/result(22750): result : d5756247-57a2-4344-915d-9599497940a7
               03-30 20:25:24.228: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-62
               03-30 20:25:24.238: I/count(22750): count : 1
               03-30 20:25:25.228: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-53
               03-30 20:25:25.238: I/count(22750): count : 1
               03-30 20:25:26.238: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-53
               03-30 20:25:26.248: I/count(22750): count : 1
               03-30 20:25:27.248: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-63
               03-30 20:25:27.248: I/count(22750): count : 1
               03-30 20:25:28.248: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-63
               03-30 20:25:28.268: I/count(22750): count : 1
               03-30 20:25:28.268: D/AndroidRuntime(22750): Shutting down VM
               03-30 20:25:28.268: W/dalvikvm(22750): threadid=1: thread exiting with uncaught exception (group=0x4188de48)
               03-30 20:25:28.278: E/AndroidRuntime(22750): FATAL EXCEPTION: main
               03-30 20:25:28.278: E/AndroidRuntime(22750): Process: com.example.becaontest, PID: 22750
               03-30 20:25:28.278: E/AndroidRuntime(22750): java.lang.RuntimeException: Unable to instantiate receiver com.example.beaconTest.BeaconReceiver: java.lang.ClassNotFoundException: Didn't find class "com.example.beaconTest.BeaconReceiver" on path: DexPathList[[zip file "/data/app/com.example.becaontest-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.becaontest-2, /vendor/lib, /system/lib]]
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2408)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.app.ActivityThread.access$1700(ActivityThread.java:142)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.os.Handler.dispatchMessage(Handler.java:102)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.os.Looper.loop(Looper.java:136)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.app.ActivityThread.main(ActivityThread.java:5120)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at java.lang.reflect.Method.invokeNative(Native Method)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at java.lang.reflect.Method.invoke(Method.java:515)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at dalvik.system.NativeStart.main(Native Method)
               03-30 20:25:28.278: E/AndroidRuntime(22750): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.beaconTest.BeaconReceiver" on path: DexPathList[[zip file "/data/app/com.example.becaontest-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.becaontest-2, /vendor/lib, /system/lib]]
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2403)
               03-30 20:25:28.278: E/AndroidRuntime(22750):     ... 10 more
               03-30 20:25:29.258: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-65
               03-30 20:25:29.268: I/count(22750): count : 1
               03-30 20:25:30.278: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-66
               03-30 20:25:30.278: I/count(22750): count : 1
               03-30 20:25:32.288: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-58
               03-30 20:25:32.298: I/count(22750): count : 1
               03-30 20:25:33.298: D/BluetoothAdapter(22750): onScanResult() - Device=D0:39:72:A4:96:95 RSSI=-57
               03-30 20:25:33.308: I/count(22750): count : 1

根據您的代碼和錯誤,您似乎沒有com.example.beaconTest.BeaconReceiver類。 您在Java代碼中聲明的BeaconReceiverMainActivity的私有內部類,因此Android無法創建它的實例。 您需要使用registerReceiver()而不是清單來注冊BeaconReceiver

  • 我不知道接收器的初始化位置。 代碼被注釋掉//receiver = new BeaconReceiver();
  • 你在onCreate注冊接收器,但你不要在銷毀時注銷它。 如果您的活動關閉,其接收方仍然可能會收到數據並嘗試更新gui,這是無效的。 這會使您的應用崩潰。
  • 因為您(自己)自己注冊了接收器,所以將其從清單中移除。

在你的Android Manifest文件中,你已經在com.example.beaconTest包中聲明了com.example.beaconTest.BeaconReceiver,但BeaconReceiver的實際位置是com.example.beaconTest.MainActivity $ BeaconReceiver,因為BeaconReceiver是一個內部類。你得到這個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM