Autore Topic: Scrivere file su disco di rete samba  (Letto 821 volte)

Offline nossa88

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note N7000
  • Sistema operativo:
    Windows 7
Scrivere file su disco di rete samba
« il: 19 Aprile 2013, 13:05:32 CEST »
0
Buongiorno a tutti, sto sviluppando una applicazione in grado di scrivere un file su di un disco di rete (il disco in questione è condiviso tramite samba)..

nel manifest ho :
Codice (XML): [Seleziona]
<uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="15" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

per scrivere il file utilizzo la seguente classe :

Codice (Java): [Seleziona]
import java.io.IOException;

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;


public class FileWrite
        {    
    public void Write (String Data, String Path, String fileName) throws Exception
            {
            try
                {
                System.out.println("00 - Path : " + Path);
                System.out.println("00 - fileName : " + fileName);
                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, null, null);
                System.out.println("01 - auth : " + auth.toString());
                String cr = "\n";
                String out_file = Path + fileName;
                SmbFile sFile = new SmbFile(out_file, auth);
               
                System.out.println("02 - sFile : " + sFile.toString());
                SmbFileOutputStream smbfos = new SmbFileOutputStream(sFile, true);
               
                System.out.println("SCRIVO");
                smbfos.write(Data.getBytes());
                smbfos.write(cr.getBytes());
               
                System.out.println("CHIUDO");
                smbfos.close();
                }
            catch (IOException e)
                {      
                e.printStackTrace();  
                }
            }
        }

lo richiamo con questa stringa
Codice (Java): [Seleziona]
Scrivi.Write("Stringa1|Stringa2", "smb://<indirizzo ip interno>/disco_condiviso/", "prova.txt");
tuttavia il progetto mi genera un errore :
Codice: [Seleziona]
04-18 13:28:11.528: E/AndroidRuntime(8875): FATAL EXCEPTION: main
04-18 13:28:11.528: E/AndroidRuntime(8875): java.lang.ExceptionInInitializerError
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFile.getFirstAddress(SmbFile.java:864)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFile.connect(SmbFile.java:951)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFile.open0(SmbFile.java:972)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFile.open(SmbFile.java:1006)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:142)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:97)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:67)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at it.nossa.bcs.FileWrite.Write(FileWrite.java:25)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at it.nossa.bcs.NossaBCS.onConfirmQuantita(NossaBCS.java:235)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at it.nossa.bcs.NossaBCS$2.onEditorAction(NossaBCS.java:201)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at android.widget.TextView.onEditorAction(TextView.java:4294)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:297)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at android.os.Handler.dispatchMessage(Handler.java:99)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at android.os.Looper.loop(Looper.java:137)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at android.app.ActivityThread.main(ActivityThread.java:4921)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at java.lang.reflect.Method.invokeNative(Native Method)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at java.lang.reflect.Method.invoke(Method.java:511)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at dalvik.system.NativeStart.main(Native Method)
04-18 13:28:11.528: E/AndroidRuntime(8875): Caused by: java.lang.ExceptionInInitializerError
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.UniAddress.<clinit>(UniAddress.java:62)
04-18 13:28:11.528: E/AndroidRuntime(8875):         ... 23 more
04-18 13:28:11.528: E/AndroidRuntime(8875): Caused by: android.os.NetworkOnMainThreadException
04-18 13:28:11.528: E/AndroidRuntime(8875):         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at java.net.InetAddress.getLocalHost(InetAddress.java:365)
04-18 13:28:11.528: E/AndroidRuntime(8875):         at jcifs.netbios.NbtAddress.<clinit>(NbtAddress.java:187)
04-18 13:28:11.528: E/AndroidRuntime(8875):         ... 24 more

come posso risolverlo?

Grazie,
Matteo
« Ultima modifica: 19 Aprile 2013, 13:12:23 CEST da nossa88 »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Scrivere file su disco di rete samba
« Risposta #1 il: 19 Aprile 2013, 13:52:19 CEST »
0
android.os.NetworkOnMainThreadException

devi usare un asynctask,un service o almeno, un thread a parte
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline nossa88

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note N7000
  • Sistema operativo:
    Windows 7
Re:Scrivere file su disco di rete samba
« Risposta #2 il: 03 Maggio 2013, 13:23:20 CEST »
0
Grazie mille per la dritta, modificando il codice in :

Codice (Java): [Seleziona]
public class FileWrite
        {    
        public void Write (final String Data, final String Path, final String fileName) throws Exception
            {
                new Thread(new Runnable()
                        {
                    public void run()
                        {
                        try
                                {
                                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, null, null);
                                String cr = "\n";
                                String out_file = Path + fileName;
                                SmbFile sFile = new SmbFile(out_file, auth);
                               
                                SmbFileOutputStream smbfos = new SmbFileOutputStream(sFile, true);
                               
                                smbfos.write(Data.getBytes());
                                smbfos.write(cr.getBytes());
                               
                                smbfos.close();
                                }
                            catch (IOException e)
                                {      
                                e.printStackTrace();  
                                }
                        }
                        }).start();
                }
        }

funziona correttamente!!