2016-07-03 11 views
0

Hier instanziieren ist der Fehler, den ich mit Blick auf bin:Es kann keinen Service-

/com.DownToLunch E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.DownToLunch, PID: 14615 
    java.lang.RuntimeException: Unable to instantiate service com.DownToLunch.Networking.RecieveSMS$MessageService: java.lang.InstantiationException: can't instantiate class com.DownToLunch.Networking.RecieveSMS$MessageService; no empty constructor 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2688) 
    at android.app.ActivityThread.access$1800(ActivityThread.java:155) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5433) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.InstantiationException: can't instantiate class com.DownToLunch.Networking.RecieveSMS$MessageService; no empty constructor 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1208) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2685) 
    at android.app.ActivityThread.access$1800(ActivityThread.java:155)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:136)  
    at android.app.ActivityThread.main(ActivityThread.java:5433)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:515)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)  
    at dalvik.system.NativeStart.main(Native Method)  

Hier ist meine Manifest-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.DownToLunch"> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
    <uses-permission android:name="android.permission.READ_SMS" /> 

    <application 
    android:name=".app.AppController" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.NoTitle"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".Otp" 
     android:theme="@style/Theme.NoTitle" /> 
    <activity android:name=".DetectOtp"></activity> 
    <receiver android:name="com.DownToLunch.Networking.RecieveSMS"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
    <service 
     android:enabled="true" 
     android:name=".Networking.RecieveSMS$MessageService"> 
    </service> 
    </application> 
</manifest> 

Hier Klasse ist, ich meinen Service definiert habe:

public class RecieveSMS extends BroadcastReceiver { 

    Context mcontext; 
    String phoneNumber; 
    String message; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Bundle bundle = intent.getExtras(); 

     mcontext=context; 
     String senderNum; 
     try { 

      if (bundle != null) { 

       final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

       for (int i = 0; i < pdusObj.length; i++) { 

        SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
        phoneNumber = currentMessage.getDisplayOriginatingAddress(); 

        senderNum = phoneNumber; 
        String message = currentMessage.getDisplayMessageBody(); 
        Log.d("Message Body",message); 
        //send(); 
        Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message); 
        Intent ie=new Intent(mcontext, MessageService.class); 
        mcontext.startService(ie); 

       } // end for loop 
      } // bundle is null 

     } catch (Exception e) { 
      Log.e("SmsReceiver", "Exception smsReceiver" + e); 

     } 
    } 
    public class MessageService extends Service { 

     @Override 
     public IBinder onBind(Intent intent) { 
      // TODO Auto-generated method stub 
      return null; 
     } 
     @Override 
     public void onCreate() { 

     } 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      // TODO Auto-generated method stub 
      send(); 
      return super.onStartCommand(intent, flags, startId); 
     } 

     // Send an Intent with an action named "custom-event-name". The Intent 
     // sent should 
     // be received by the ReceiverActivity. 
     public void send() { 
      //Log.d(TAG, "MainActivity.send()"); 
      Intent sendableIntent = new Intent("otp"); 
      sendableIntent.putExtra("message",message); 
      LocalBroadcastManager.getInstance(mcontext). 
        sendBroadcast(sendableIntent); 

     } 

    } 


} 

Hier empfange ich diese otp und versuche, es in den Toast zu zeigen:

public class DetectOtp extends AppCompatActivity { 

    String message; 
    private IntentFilter receiveFilter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detect_otp); 
     receiveFilter = new IntentFilter("otp"); 
     LocalBroadcastManager.getInstance(this). 
       registerReceiver(handler, receiveFilter); 

    } 
    private BroadcastReceiver handler = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Bundle b =intent.getExtras(); 
      // b = getIntent().getExtras(); 
      message = intent.getStringExtra("message"); 
      Log.d("Message",message); 
      Toast.makeText(DetectOtp.this, 
        message, Toast.LENGTH_LONG).show(); 
     } 
    }; 
} 

Wo mache ich den Fehler? Während der Dienst starten Sie den Wert senden LocalBroadcastManager mit ihm diesen Fehler zeigt:

com.DownToLunch.Networking.RecieveSMS$MessageService:
java.lang.InstantiationException: can't instantiate class
com.DownToLunch.Networking.RecieveSMS$MessageService; no empty

+0

Ich erhalte diesen Fehler, wenn der Dienst nicht verwendet wird, eine lokale broacast zu machen: Prozess: com.DownToLunch, PID: 15593 java.lang.NullPointerException: println eine Nachricht bei android.util.Log.println_native braucht (Native Methode) bei android.util.Log.d (Log.java:164) ) –

+0

'println benötigt eine Nachricht' bedeutet, dass Sie" null "an einen' Log. *() 'Anruf übergeben. Sind Sie sicher, dass Sie den 'Intent' extra korrekt im Empfänger anhängen? –

+0

natürlich..hier ist der Code: Intent sendableIntent = new Intent ("otp"); sendableIntent.putExtra ("Nachricht", Nachricht); LocalBroadcastManager.getInstance (mkontext). sendBroadcast (sendableIntent); –

Antwort

0

ersetzen:

public class MessageService extends Service 

mit:

static public class MessageService extends Service 

können Sie haben kein Service eine innere Klasse sein So wie du es jetzt hast.

+0

Wenn ich static für MessageService-Klasse verwenden, wenn nicht auf eine Nachricht eine mcontext-Variable von send() - Funktion zugreifen kann. –

+0

@ShanPLT: Richtig. Beachten Sie, dass ein 'Service' * * ein' Kontext' ist. – CommonsWare

+0

Entschuldigung, können Sie es bitte ausführlich erklären –