java.lang.runtimeexception无法实例化接收器

java.lang.runtimeexception无法实例化接收器,java,android,Java,Android,我正在开发一个扫描灯塔的应用程序。 当应用程序扫描信标时,应用程序将更改接收BR(BroadcastReceiver)消息的UI文本 应用程序启动后,若单击按钮,则服务启动。 若扫描了信标,则活动类从服务类接收到BR消息,并且Ui文本将发生更改。 但一两秒钟后的应用程序将关闭,并显示错误日志 代码: MainActivity.java public class MainActivity extends Activity { Button start; TextView text; privat

我正在开发一个扫描灯塔的应用程序。 当应用程序扫描信标时,应用程序将更改接收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);
}
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++;
                }


            }
        }           
    });
}
}

代码:beacervice.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);
}
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>

根据您的代码和错误,您似乎没有
com.example.beacety.BeaconReceiver
类。您在Java代码中声明的
BeaconReceiver
MainActivity
的私有内部类,因此Android无法创建它的实例。您需要使用
registerReceiver()
,而不是清单来注册您的
BeaconReceiver

  • 我看不出接收器在哪里初始化。代码被注释掉
    //receiver=new BeaconReceiver()
  • 在onCreate中注册接收器,但在destroy中不取消注册。如果您的活动关闭,其接收器仍可能接收数据并尝试更新gui,这不再有效。这将使你的应用程序崩溃
  • 由于您自己正在(取消)注册您的接收者,请将其从清单中删除

在您的Android清单文件中,您已经在com.example.beacety包中声明了com.example.beacety.BeaconReceiver,但BeaconReceiver的实际位置是com.example.beacety.main活动$BeaconReceiver,因为BeaconReceiver是一个内部类。也就是说,您收到了此错误。

谢谢您的评论。我已经在onCreat()的MainActivity上使用了registerReceiver()。您将能够找到源代码。@Park:那没关系。由于清单条目不正确,您正在崩溃。修复清单,例如删除
元素(通过
registerReceiver()注册的接收者不需要清单)。谢谢。我修复了清单,应用程序中没有错误。感谢您的评论。“//receiver=new BeacoReceiver。”代码是我的错误。除“//”代码外的原始源代码。我将在onDestroy()中输入注销代码。