Witam!

Chciałem przesłać sobie zawartość sms inbox na PC.
Rozwiązane jest dokopanie się do danych na androidze, organizacja w struktury i NIBY wysyłanie. Niestety po drugiej stronie a więc na PC otrzymuje błędy typu invalid header:04. Nie mam pojęcia dlaczego tak się dzieje. Do przesyłu wykorzystuje pewne metody(podam je ponizej) przy użyciu których przesyłam np nazwe telefonu, zawartość książki telefonicznej (razem ze zdjęciami) i to działa. Zauważyłem również, że jeżeli próbuję przesłać każdego sms osobno - działa bez problemu tylko trwa ROK ALBO 2.
Dlatego też chce utworzyć sobie ArrayList zawierający wszystkie sms i przesłać ten jeden obiekt - w tym przypadku wszystko się kraszuje - (po stronie juz pc) malformed header itd itp :( Dlaczego?

PS. SmsEntry które będzie gdzieś poniżej to zwykła klasa zawierająca tylko pola typu int i string oraz gettery i settery do nich.
klasy TransmissionHandler oraz SmsEntry są we wspólnej bibliotece wykorzystywanej zarówno przez pc i androida.

Pobranie i wysłanie listy z wiadomościami sms

    private void SendSmsList() throws IOException {
        {
            Log.d("SendMe sms", "Reading and sending sms list");
            Uri allMessages = Uri.parse("content://sms/");
            //Cursor cursor = managedQuery(allMessages, null, null, null, null); Both are same
            String[] project = new String[]
            {
                "_id",
                "thread_id", "person", "date", "read", "status", "type", "body"
            };
            Cursor cursor = currentService.getContentResolver().query(allMessages, project,
                    null, null, null);
            SmsEntry sms = new SmsEntry();

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            int i=0;
            ArrayList<SmsEntry> array=new ArrayList<SmsEntry>(1000);
                while (cursor.moveToNext() && ++i<2000)
                {
                    sms = new SmsEntry();
                    sms.setMessageId(cursor.getInt(0));
                    sms.setThreadId(cursor.getInt(1));
                    sms.setPersonId(cursor.getInt(2));
                    sms.setDate(cursor.getLong(3));
                    sms.setRead(cursor.getInt(4));
                    sms.setStatus(cursor.getInt(5));
                    sms.setType(cursor.getInt(6));
                    sms.setMessage(cursor.getString(7));
                    sms.setDstNumber("NAN");
                    array.add(sms);

                }
                oos.writeObject(array);
                oos.flush();
                baos.close();
                Log.d("SendMe sms", "Size "+baos.size());
                SendData(baos.toByteArray());
}

    private void SendData(byte[] data) throws IOException {
        try
        {
            th.SendDataSize(data.length);
            th.SendData(data);
        }
        catch (IOException ex)
        {
            Logger.getLogger(DataProvider.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

(th) transmision handler SendData i ReceiveData

    public boolean SendData(byte[] data) throws IOException {
        if (ReceiveCommand().equals(DataTransferTag.DATA_ACK)) {
            SendCommand(DataTransferTag.DATA_ACK);
            output.write(data);
            output.flush();
            return false;
        } else {
            return true;
        }
    }

    public ByteBuffer ReceiveData() throws IOException {
        /*       long size=ReceiveDataSize();
        ByteBuffer ret;      
        SendCommand(DataTransferTag.DATA_ACK);
        if (ReceiveCommand().equals(DataTransferTag.DATA_ACK)) { // wait for readyness of sockt endpoint
        dataBuffer.clear();          
        input.read(dataBuffer.array(), 0, (int) size);
        ret=ByteBuffer.allocate((int) size).put(dataBuffer.array(),0,(int)size);
        ret.clear();

        return ret;
        } else {
        return null;
        }*/

        long size = ReceiveDataSize();
        long chunk = 0;
        long parts=0;
        int length=this.notifySize;
        byte[] buff = new byte[this.notifySize];
        DataTransferEvent e=new DataTransferEvent(0,size);
        SendCommand(DataTransferTag.DATA_ACK);
        if (ReceiveCommand().equals(DataTransferTag.DATA_ACK)) {
            dataBuffer.clear();
            while (chunk<size) 
            {
                if((size-chunk)<length) length=(int) (size-chunk);
                chunk+=input.read(buff, 0, length);
                dataBuffer.put(buff);
                e.chunkSize=chunk;
                this.notifyRecveiveListeners(e);
            }

            return ByteBuffer.allocate((int) size).put(dataBuffer.array(),0,(int)size);
        }
        return null;
    }

Odbiór po stronie PC

 public void RefreshMessagesList() {
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                try
                {
                    mf.setStatus("Requesting Sms/Mms entries ...");
                    final TransmissionHandler th = ConnectionManager.getInstance().th;
                    MessagePanel mp = mf.getMessagePanel();
                    mp.clearList();
                    messages.clear();
                    int mark = 0;
                    int dataSize = 0;
                    boolean cons = true;
                    th.SendCommand(DataTransferTag.REQUEST_SMS_LIST);
                    //   while (cons) {
                    mf.setStatus("Receiving...(" + (mark++) + ")");
                    ByteArrayInputStream bais = new ByteArrayInputStream(th.ReceiveData().array());
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    mf.setStatus("Parsuje...");
                    //     while (ois.available() > 0)
                    Object o=ois.readObject();    // TUTAJ WYSYPUJE WYJĄTKIEM O NIEPOPRAWNYM HEADERZE STREAMU 
                    messages=(ArrayList<SmsEntry>) o;

                    for(SmsEntry sms:messages)
                        mp.AddEntry(sms);
                    mf.setStatus("Done");

                }
                catch (ClassNotFoundException ex)
                {
                    Logger.getLogger(SmsManager.class.getName()).log(Level.SEVERE, null, ex);
                }
                catch (IOException ex)
                {
                    Logger.getLogger(SmsManager.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        t.setName("SmsRetrieval");
        t.setPriority(5);
        t.setDaemon(true);
        t.start();
    }

www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!