Skocz do zawartości
chrisss

Lista plików z FTP

    Rekomendowane odpowiedzi

    Cześć,

    Jestem na etapie nauki Javy bawiąc się w Android Studio.

    Chcę stworzyć prostą aplikację, która pobierze listę plików z folderu na serwerze FTP.

    Potem "zczyta" z ostatniego pliku datę jego stworzenia, a 3 ostatnie pliki wyświetli w aplikacji.

    Stworzyłem coś takiego (na bazie zagranicznych tutoriali):

    {
    //pliki z serwera
        String ftpUrl = "ftp://%s:%[email protected]%s/%s;type=d";
        String host = "...";
        String user = "...";
        String pass = "...";
        String dirPath = "/";
    
        ftpUrl = String.format(ftpUrl, user, pass, host, dirPath);
        TextView startt = (TextView) findViewById(R.id.textView4);
        startt.setText("URL: " + ftpUrl);
    
        try {
            URL url = new URL(ftpUrl);
            URLConnection conn = url.openConnection();
            InputStream inputStream = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
    //tutaj dodam listview zamiast powyższego
            } inputStream.close();
        } catch(IOException ex){
            ex.printStackTrace();
        }
    }

    Aplikacja crashuje na starcie.

    Proszę o pomoc, nigdzie nie mogę znaleźć żadnych gotowców, ani nawet możliwie bliskich żeby zmodyfikować.

    Z góry wielkie dzięki!

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Coderoid

    Pokaż logi. Obstawiam wykonanie zapytania na wątku UI lub brak uprawnień w Manifest.xml

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Godzinę temu, Coderoid napisał:

    Pokaż logi. Obstawiam wykonanie zapytania na wątku UI lub brak uprawnień w Manifest.xml

    Plik manifest wygląda następująco:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.aa.testowa1">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".DrugaAktywnosc"></activity>
        </application>
    </manifest>

     

    Natomiast logi są czyste:

    Cytuj

    Split APKs installed
    $ adb shell am start -n "com.example.aa.testowa1/com.example.aa.testowa1.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
    Client not ready yet..Waiting for process to come online
    Waiting for process to come online
    Connected to process 2497 on device Nexus_5_API_25 [emulator-5554]
    Application terminated.

    Aplikacja kompiluje się, na emulatorze wyskakuje komunikat o zamknięciu aplikacji.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Coderoid

    To nie są logi dotyczące crasha apki. znajdziesz je w locgcat 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    10 godzin temu, Coderoid napisał:

    To nie są logi dotyczące crasha apki. znajdziesz je w locgcat 

    Poniżej logi:

    Cytuj

      --------- beginning of crash
    06-19 15:07:40.747 2657-2657/com.example.aa.testowa1 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.example.aa.testowa1, PID: 2657
                                                                           java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.aa.testowa1/com.example.aa.testowa1.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2567)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                               at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                            Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                                                                               at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:120)
                                                                               at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:155)
                                                                               at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:31)
                                                                               at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:55)
                                                                               at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:33)
                                                                               at android.support.v7.app.AppCompatDelegateImplN.<init>(AppCompatDelegateImplN.java:33)
                                                                               at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201)
                                                                               at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185)
                                                                               at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
                                                                               at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
                                                                               at com.example.aa.testowa1.MainActivity.<init>(MainActivity.java:67)
                                                                               at java.lang.Class.newInstance(Native Method)
                                                                               at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2557)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                               at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

    Z góry wielkie dzięki za pomoc!

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Coderoid

    Kod który zapodałeś niewiele mówi jeśli połączymy to z logami. Jedyne czemu bym się przyjrzał to czy aby napewno masz textView4 w pliku layoutu.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Teraz, Coderoid napisał:

    Kod który zapodałeś niewiele mówi jeśli połączymy to z logami. Jedyne czemu bym się przyjrzał to czy aby napewno masz textView4 w pliku layoutu.

    Wywaliłem textView zarówno z activity jak i kodu java i appka nadal crashuje.

    Masz jakiś pomysł jak napisać kod, który będzie ściągał listę plików z FTP?

    Ew. jakoś przerobić ten który mam?

    Pytanie czy przed { nie powinienem dodać np.

    protected void onCreate(..?

    ?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Coderoid

    Pokaż całą klasę (pod warunkiem że nie ma 500 linijek kodu). Jeśli jednak Twój projekt jest słabo czytelny to proponuje wrzucić kod na githuba lub bitbucketa.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    2 minuty temu, Coderoid napisał:

    Pokaż całą klasę (pod warunkiem że nie ma 500 linijek kodu). Jeśli jednak Twój projekt jest słabo czytelny to proponuje wrzucić kod na githuba lub bitbucketa.

    Projekt zawiera też inne elementy (zbędne), jednak wklejam całość.

    Najważniejszy temat FTP.

     

    MainActivity.java

    package com.example.aa.testowa1;
    
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.MenuInflater;
    import android.view.View;
    import android.view.MenuItem;
    import android.view.Menu;
    import android.widget.TextView;
    import android.widget.EditText;
    import android.widget.Button;
    import android.view.ContextMenu;
    import java.util.Calendar;
    import java.util.TimeZone;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //data i godzina pokazuje samemu
            int r, m, d, h, min, s;
            Calendar c = Calendar.getInstance();
            r = c.get(Calendar.YEAR);
            m = c.get(Calendar.MONTH) + 1;
            d = c.get(Calendar.DAY_OF_MONTH);
            h = c.get(Calendar.HOUR_OF_DAY);
            min = c.get(Calendar.MINUTE);
            s = c.get(Calendar.SECOND);
            TextView d_txt = (TextView) findViewById(R.id.textView1);
            d_txt.setText(r + " - " + m + " - " + d);
            TextView t_txt = (TextView) findViewById(R.id.textView2);
            t_txt.setText(h + " : " + min + " : " + s);
    
            //menu kontekstowe do button4
            Button button = (Button) findViewById(R.id.button4);
            registerForContextMenu(button);
        }
    
    //dodajemy menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    {
    //pliki z serwera
        String ftpUrl = "ftp://%s:%[email protected]%s/%s;type=d";
        String host = "...";
        String user = "...";
        String pass = "...";
        String dirPath = "/";
    
        ftpUrl = String.format(ftpUrl, user, pass, host, dirPath);
    
        try {
            URL url = new URL(ftpUrl);
            URLConnection conn = url.openConnection();
            InputStream inputStream = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            } inputStream.close();
        } catch(IOException ex){
            ex.printStackTrace();
        }}
    
    
        //menu kontekstowe
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_kontekst, menu);
        }
    
    //przenosi tekst do drugiej aktynwosci
        public void LadujDrugaAktywnosc(View view){
    Intent intent = new Intent(MainActivity.this, DrugaAktywnosc.class);
            EditText editText = (EditText) findViewById(R.id.editText2);
            String message = editText.getText().toString();
            intent.putExtra("textmessaege", message);
            startActivity(intent);
        }
    
        //wyłącza aplikację
            public void kliknieto(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setMessage("Czy na pewno zakończyć?");
                builder.setCancelable(true);
                builder.setPositiveButton("Tak", new DialogInterface.OnClickListener() {
                    @Override
                    //CO ROBI GDY TAK
                    public void onClick(DialogInterface dialog, int which) {
                        MainActivity.this.finish();
                    }
                });
                builder.setNegativeButton("Nie", new DialogInterface.OnClickListener() {
        @Override
        //co robi gdy nie
        public void onClick(DialogInterface dialog, int which) {
    dialog.cancel();
        }
                        });
                    AlertDialog alert1 = builder.create();
                alert1.show();
    }
            }
    

    Activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.aa.testowa1.MainActivity">
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="500dp"
            android:layout_weight="1"
            android:orientation="vertical"
            android:weightSum="1"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            tools:layout_editor_absoluteY="8dp">
    
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/button2"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="30dp"
                android:text="Data"
                android:textColor="#ffa000"
                android:textSize="40dp"
                android:textStyle="bold" />
    
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView1"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="30dp"
                android:text="Godzina"
                android:textColor="#ffa000"
                android:textSize="40dp"
                android:textStyle="bold" />
    
            <EditText
                android:id="@+id/editText2"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:ems="10"
                android:inputType="textPersonName"
                android:text="Name"
                android:layout_weight="0.24" />
    
            <Button
                android:id="@+id/button"
                android:layout_width="327dp"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/editText2"
                android:layout_marginTop="46dp"
                android:layout_toLeftOf="@+id/button3"
                android:layout_toStartOf="@+id/button3"
                android:onClick="LadujDrugaAktywnosc"
                android:text="Przejdz" />
    
            <Button
                android:id="@+id/button3"
                android:layout_width="327dp"
                android:layout_height="26dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="11dp"
                android:layout_marginEnd="13dp"
                android:layout_marginRight="13dp"
                android:layout_weight="0.08"
                android:onClick="kliknieto"
                android:text="Zakończ"
                tools:layout_editor_absoluteX="121dp"
                tools:layout_editor_absoluteY="270dp" />
    
            <Button
                android:id="@+id/button4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Button" />
    
        </LinearLayout>
    
    </android.support.constraint.ConstraintLayout>

    Manifest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.aa.testowa1">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".DrugaAktywnosc"></activity>
        </application>
    </manifest>

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Coderoid

    Po pierwsze nie wiem w jaki sposób to Ci się w ogóle kompiluje skoro mniej więcej na wysokości komentarza //pliki z serwera powinna być metoda a są tylko klamerki. Natomiast Twój problem z tematu jest taki, że w pliku XML nie posiadasz kontrolki z id textView4 a próbujesz to zbindować w kodzie przez co dostajesz null pointer exception. 

    • Lubię to! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x