2

レシーバーを内部クラスとして使用する SmsService.java と呼ばれる Android のサービス実装を通じて、GSM SMS 通信に基づくモバイル アプリケーションを開発しました。SmsService では、アプリケーションの実行中に常に実行される Android サービスを使用します。私は、aidl (インターフェイス言語) を使用して BinderProxy を使用して使用しますが、正常に動作しますが、しばらくすると例外メッセージが表示されます。メッセージと SmsService.java クラスのコードにタグを付けます。先生、解決方法を教えてください。事前に感謝し、理解できない場合は下手な英語で申し訳ありません..

例外ログは..

04-24 12:53:04.230: E/SMSReceiver(980): Failed to notify listener aidl.com.services.MessageListener$Stub$Proxy@40528870

04-24 12:53:04.230: E/SMSReceiver(980): android.os.DeadObjectException
04-24 12:53:04.230: E/SMSReceiver(980):     at android.os.BinderProxy.transact(Native Method)

04-24 12:53:04.230: E/SMSReceiver(980):     at aidl.com.services.MessageListener$Stub$Proxy.handleNewMessage(MessageListener.java:76)

04-24 12:53:04.230: E/SMSReceiver(980):     at com.services.SmsService$SMSReceiver.onReceive(SmsService.java:227)
04-24 12:53:04.230: E/SMSReceiver(980):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
04-24 12:53:04.230: E/SMSReceiver(980):     at android.os.Handler.handleCallback(Handler.java:587)
04-24 12:53:04.230: E/SMSReceiver(980):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-24 12:53:04.230: E/SMSReceiver(980):     at android.os.Looper.loop(Looper.java:130)
04-24 12:53:04.230: E/SMSReceiver(980):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-24 12:53:04.230: E/SMSReceiver(980):     at java.lang.reflect.Method.invokeNative(Native Method)
04-24 12:53:04.230: E/SMSReceiver(980):     at java.lang.reflect.Method.invoke(Method.java:507)
04-24 12:53:04.230: E/SMSReceiver(980):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-24 12:53:04.230: E/SMSReceiver(980):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-24 12:53:04.230: E/SMSReceiver(980):     at dalvik.system.NativeStart.main(Native Method)

最後に、SmsService.java のコード

public class SmsService extends Service {

    private SMSReceiver mSMSreceiver;
    private IntentFilter mIntentFilter;
    private DataBaseAdapter dba;
    private String Tag = SmsService.class.getSimpleName();
    public final Object latestSearchResultLock = new Object();
    public List<MessageListener> listeners = new ArrayList<MessageListener>();
    private static  BufferedWriter out;
    private static int id = 0;
    private static int msgId= 0;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        if(SmsService.class.getName().equals(arg0.getAction())){
            Log.d(Tag, "Binding Complete" + arg0);
            return apiEndpoint;
        }else
            return null;
    }
    public SmsService(){        
        /*dba = new DataBaseAdapter(this);*/
        /*dba = DataBaseAdapter.getInstance(this);*/
        mSMSreceiver = new SMSReceiver(this);
        Log.i("On Constructor", "Assign Service");

    }
    private final Object findLatest = new Object();
    private MessageQueue<newItem> msgQueue = new MessageQueue<newItem>();

    public SmsService getService(){
        return SmsService.this;
    }

    private MessageReceiverApi.Stub apiEndpoint = new MessageReceiverApi.Stub(){

    @Override
    public void addListener(MessageListener listener) throws RemoteException {
        // TODO Auto-generated method stub
        synchronized(listeners){
            listeners.add(listener);
        }
    }

    @Override
    public void removeListener(MessageListener listener) throws RemoteException {
        // TODO Auto-generated method stub
        synchronized (listeners) {
            listeners.remove(listener);
        }
    }

    @Override
    public MessageQueue<newItem> getMessageQueueUpdated()
            throws RemoteException {
        // TODO Auto-generated method stub
        synchronized(findLatest){
            return msgQueue;
        }

    }   
    };
    @Override
    public void onCreate(){
        super.onCreate();   
        Log.i(Tag, "Service is creating");
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(ConstantClass.SMS_RECEIVED);
        registerReceiver(mSMSreceiver,mIntentFilter);       
        Log.i(Tag, "Service is creating Successfully");
    }
    @Override 
    public int onStartCommand(Intent intent , int flags, int type){
        return START_STICKY;
    }   

    @Override 
    public void onDestroy(){
        super.onDestroy();  
        unregisterReceiver(mSMSreceiver);   
        /*if(dba!=null)
            DataBaseAdapter.getInstance(this).closeConnection();*/
    }   
    public class SMSReceiver extends BroadcastReceiver {
        /*private DataBaseAdapter dba;*/
        private Context context;
        @SuppressWarnings("unused")
        private String Strsql;
        private SMSSync sync;           
        private UtilityFunction utility;
        private boolean isCrdMatch;
        private String address,Phnumber, msg=null/*,panId =null*/,curMsg=null,mtemp=null;       
        private String devid,incAddr;
        @SuppressWarnings("unused")
        private Handler handle;
        private MessageQueue<newItem> list;
        private newItem item;
        private String Tag = SMSReceiver.class.getSimpleName();     
        public SMSReceiver(Context ctx){
            this.context = ctx;
            list=new MessageQueue <newItem>();
        }
        @Override
        public void onReceive(Context context,final Intent intents){            
            /*dba = new DataBaseAdapter(context);   */
            dba = DataBaseAdapter.getInstance(this.context);
            utility = new UtilityFunction(context);
            sync = new SMSSync(context);        
            if (intents.getAction().equals(ConstantClass.SMS_RECEIVED)) {           
            try{
                Bundle bundle = intents.getExtras();            
                if (bundle != null) {                   
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++)
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);                   

                    for (SmsMessage message : messages) {
                        msg = message.getMessageBody();
                        incAddr = message.getOriginatingAddress();
                    }
                    /*Thread.sleep(50);*/                   
                    mtemp = getMessage(msg);
                    if(mtemp!=null){ 
                        item = new newItem(mtemp);
                        list.enqueue(item); 
                        while(!list.isEmpty()){                     
                            curMsg =  list.peek().getItem();                        
                            if(curMsg.startsWith("<") &&  curMsg.endsWith(">")){
                                msgId = 0;
                                char mid = curMsg.charAt(3);
                                msgId = (int )mid;
                                Log.i(Tag, "message id:="+ msgId);                                                      
                                //dba.SetSynchronization();
                                if(msgId==50 || msgId == 54 || msgId == 56 || msgId==65 || msgId == 67 || msgId == 69 || msgId == 75 || msgId == 76){
                                    utility.displayNotification(this.context,curMsg);                                   
                                }else{                                      
                                    devid = curMsg.substring(4, 20);
                                    /*if(!dba.IsConOpenOrClose())
                                        dba.openRead();*/
                                    Cursor cur = dba.getRecordAcToID(DeviceStorage.TABLE_DEVICE, new String[]{DeviceStorage.Key_AlarmTime },
                                        DeviceStorage.Key_DevID , devid);                               
                                    if(cur.getCount()>0){
                                        cur.moveToFirst();
                                        int almTime = Integer.valueOf(cur.getString(0));
                                        if(almTime==0)
                                            utility.displayNotification(this.context,curMsg);
                                    }
                                }
                                /*if(!dba.IsConOpenOrClose())
                                    dba.Open();*/
                                int count = dba.getDeviceCount(DeviceCurrent.TABLE_CURRENT);                            
                                if(count<=0){
                                    dba.InsertCurrentCoord(id,id);
                                }else{
                                    dba.updateCommon(DeviceCurrent.TABLE_CURRENT, DeviceCurrent.Key_ReceiverCoord, DeviceCurrent.Key_ID , Integer.toString(id), Integer.toString(1));   
                                    dba.updateCommon(CoordStore.TABLE_COORD, CoordStore.Key_IsReceiverUpdate, CoordStore.Key_MBID, Integer.toString(1), Integer.toString(id));
                                    Log.i(Tag, "Updateing Coordinator for Receiver");
                                }   
                                /*sid = dba.CurrentWorkingCoordinator(DeviceCurrent.Key_SendCoord, 1);*/                                                                                        
                                Log.i(Tag, "Updateing DataBase Only for Record");       
                                ConstantClass.IsReadLog=false;
                                sync.smsProcess(curMsg);                                                        
                                /*if(msgId==50 && sid == id){
                                    panId = curMsg.substring(22, 26);
                                    authority = utility.getAuthority(); 
                                    if(authority.equals("A") && panId.equals("3000")){
                                        ConstantClass.Clear_Main_Screen=false;
                                        ConstantClass.isMainOpen = false;
                                        Intent intent = new Intent(this.context,SettingScreen.class);   
                                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                                        context.startActivity(intent);                      
                                    }
                                }       */
                                utility.getLicense();
                                Log.i(Tag, "ConstantClass Log " + String.valueOf(ConstantClass.LOGS));
                                if(ConstantClass.LOGS){
                                    WriteOnLog(curMsg,1);                                       
                                }           
                                abortBroadcast();
                                /************Now deleting the SMS from the Inbox*********************/                      
                                removeMessage(this.context, Phnumber);  
                                list.dequeue();                                         
                            synchronized(listeners){
                                for (MessageListener listener : listeners) {
                                    try {   
                                        /*listener.notify();*/
                                        listener.handleNewMessage();
                                        /*listener.asBinder();*/
                                        } catch (RemoteException e){
                                            Log.e(Tag, "Failed to notify listener " , e);
                                        }
                                    }
                                }           
                            }                                       
                        }                   
                    }
                }
            }catch(Exception e){
                Toast.makeText(this.context, "On SMS Receiver" + e.getMessage(), Toast.LENGTH_LONG).show();
                WriteOnLog(curMsg,0);
            } /*catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/finally{
                /*if(dba.IsConOpenOrClose())
                    dba.close();
                dba=null;*/
                utility = null;
                sync=null;
            }
            }
            if(ConstantClass.Clear_Main_Screen==true && ConstantClass.isMainOpen == true){
                Intent intent = new Intent(context,ZigbeeActivity.class);   
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);      
            }       
        }   
        private void removeMessage(Context context, String fromAddress) {
            Uri uriSMS = Uri.parse("content://sms/inbox");
            Cursor cursor = null;
            /*if(!dba.IsConOpenOrClose())
                dba.Open();*/
            try{
            cursor = context.getContentResolver().query(uriSMS, null, null, null, null);
            cursor.moveToFirst();
            if(cursor.getCount() > 0){ 
                int ThreadId = cursor.getInt(1);                     
                context.getContentResolver().delete(Uri.parse("content://sms/conversations/"+ThreadId), "address=?",new String[]{fromAddress});
                Log.d("Message Thread Deleted", fromAddress);         
                }         

            }catch(Exception e){
            Log.e("remove Message", e.getMessage());
            }finally{
                if(cursor!=null)
                    cursor.close();   
                /*if(dba.IsConOpenOrClose())
                    dba.close();*/
            }
        }       
    private String getMessage(String msg){
        String newMsg = null;
        try{
            int tl = incAddr.length();
            int l = tl - ConstantClass.NO;
            address = incAddr.substring(l,tl);
            isCrdMatch = MatchCoord(address);                           
            if(isCrdMatch == true) {                                
                if(msg.startsWith("<") && msg.contains(">")){                   
                    int len = Integer.valueOf(msg.substring(1, 3), 16).intValue();
                    int index = msg.indexOf(">");
                    Log.i(Tag, "Value is:" + len);
                    Log.i(Tag, "index value is:" + index);
                    if(len==index+1){
                        newMsg = msg.substring(0, len); //getting the length of the whole message and except the Garbage / 
                        Log.i(Tag, "receiving msg length is:=" + len);
                        Log.i(Tag, "receiving msg is:=" + newMsg);
                        return newMsg;  
                    }else{
                        Toast.makeText(this.context, "message Corrupt" + address, Toast.LENGTH_LONG).show();
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return newMsg;
    }
        private boolean MatchCoord(String no){
            boolean isMatched = false;
            String crdNo = null;
            Cursor cursor = null;           
            try{
            cursor = dba.SelectCommon(CoordStore.TABLE_COORD, new String[]{CoordStore.Key_MBID,CoordStore.Key_MbNo}, 
                    CoordStore.Key_MbNo , new String[]{no});
            if(cursor.getCount()>0)
                cursor.moveToFirst();
            do{
                crdNo = cursor.getString(cursor.getColumnIndex(CoordStore.Key_MbNo));
                if(crdNo.equals(no)){               
                    id = cursor.getInt(cursor.getColumnIndex(CoordStore.Key_MBID));
                    Phnumber = crdNo;
                    Log.i(Tag, "Crd No is:" + Phnumber);
                    isMatched = true;
                    break;
                }
            }while(cursor.moveToNext());            
            }catch(Exception e){
                Log.e(Tag, e.getMessage());
            }finally{
                if(cursor!=null)
                    cursor.close();
            }
            return isMatched;
        }
        private void WriteOnLog(String msg,int crpt){
            File exportDir =  new File("/sdcard/CIH");     
            if (!exportDir.exists())          {              
            exportDir.mkdirs();          
            }   
            String fileName;            
                fileName = "log" + ".txt";          
            File file = new File(exportDir,fileName); 
            String txt=null ;
            try {
                if(!file.exists()){
                    file.createNewFile();
                    FileWriter Write = new FileWriter(file,true);
                    out = new BufferedWriter(Write);
                    txt = "Date Time |" + " Send/Receive |" + " Controller No |" + " Success |" +" Message " + " | Corrupt";
                     out.write( txt + "\r\n" );
                     out.flush();
                     out.close();
                }
                /*FileWriter Write = new FileWriter(file,true); 
                out = new BufferedWriter(Write);*/
                //txt = "Date Time |" + " Send/Receive |" + " Controller No |" +" Message " ;
                String header = "Date Time |" + " Send/Receive |" + " Controller No |" + " Success |" +" Message " + "| Corrupt \r\n" ;
                String dd=null,mm=null,yy=null,hh=null,min=null,ss=null,dt=null;    
                SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
                String newtime =  sdfDateTime.format(new Date(System.currentTimeMillis()));             
                yy = newtime.substring(2, 4);
                mm = newtime.substring(5, 7);
                dd = newtime.substring(8, 10);
                hh = newtime.substring(11, 13);
                min = newtime.substring(14, 16);
                ss = newtime.substring(17); 
                dt = dd+"-"+mm+"-"+yy +" " + hh + ":" + min +":"+ ss;
                if(crpt == 0)
                    txt = dt + " | " +" Receive " + "| " + address + " | " + " Successfull |" + msg.toUpperCase() +" | " + " Yes \r\n" ;
                else
                    txt = dt + " | " +" Receive " + "| " + address + " | " + " Successfull |" + msg.toUpperCase() + "| No \r\n"; 

                prepend(file.getAbsolutePath(),txt,header);
                /*out.write( txt + "\n");       
                out.flush();*/          
            }          
            catch(IOException sqlEx)  {              
            Log.e("MainActivity", sqlEx.getMessage(), sqlEx);        
            }   
        }
        public  void prepend(String filename,String data,String Header) throws IOException{

             BufferedReader in = new BufferedReader(new FileReader(filename));
             StringBuilder reply = new StringBuilder();

             String str = new String();     
             reply.append(Header);       
             //////////now appending the data that current sms /////////
             reply.append(data);
             int i = 0;
             while( (str = in.readLine())!=null ){
                 if(i!=0)
                     reply.append(str + "\r\n");
               i++;
             }

             str = reply.toString();
             BufferedWriter out= new BufferedWriter(new FileWriter(filename));
             out.write(str);        

             if(in !=null){
             try{ 
                 in.close();
                 } catch(IOException e){
                 e.printStackTrace();
                 }
             if(out!=null)
                try{
                    out.close();
                } catch(IOException ex) {
                    ex.printStackTrace();
                }
            }
            }       
        }
    }
4

0 に答える 0