Zugriff auf Bilder auf der SD-Karte und dem USB-Speicher

  • 6 Antworten
  • Neuester Beitrag
Diskutiere Zugriff auf Bilder auf der SD-Karte und dem USB-Speicher im Android App Entwicklung im Bereich Betriebssysteme & Apps.
O

olsvse

Neues Mitglied
Hallo Zusammen,

Kurz vorweg ich bin ein Android-Newbee.
Programmieren kann ich (C,C++, pascall, basic usw. Java nur wären des Studiums kurz angeschaut.)

Mein Ziel ist eine kleine App zu schreiben, mit der ich im Urlaub meine Bilder von der Kamera auf die SD-Karte kopieren kann und sie sollen auch automatisch nach dem Aufnahmedatum umbenannt werden welches aus dem EXIF-Header gelesen werden soll.

Ich hab mir als Grundlage "Jetzt lerne ich Android 4 Programmierung" gekauft.

Ich versuche meine App spielerisch auf das ziel hin Schritt um Schritt zu erweitern.

Bis jetzt bin ich soweit dass ich ein Textfeld per Button auslesen kann und auf einer Textview ausgeben kann.

Der nächste Schritt ist jetzt ein Verzeichnis auszulesen (auf der SD-Karte bzw auf der kamera) und die darin enthaltenen Dateien auf dem TextView auflisten will.

Von der Struktur Her müsste es gehen. Aber wenn ich z.B. "/" oder "/mnt/sdcard" eingebe bekomme ich immer die aussage, dass das verzeichnis nicht existiert.

Sobald ich das hin bekommen habe will ich von einer Bilddatei den exif-Header mit der Metadaten-Lib von drew auslesen. Ich habe mir die kompilierten und die Sourcen herunter geladen. Nur wie binde ich die Jar-datei richtig in mein eclipse-project ein, dass ich die einzelnen Klassen richtig importieren kann.

So hier jetzt der Code den ich zum auslesen des Verzeichnisses verwende:
Code:
    class MeinClickListener implements OnClickListener {
        public void onClick(View v) {            
            EditText MyPfad= (EditText) findViewById(R.id.editText1);
            String Pfadangabe = (String) MyPfad.toString();
            File PfadObj = new File(Pfadangabe);
            if (!PfadObj.exists()) {
                 Toast einToast = Toast.makeText(v.getContext(), "Das Verzeichnis existiert nicht!", Toast.LENGTH_SHORT);
                 einToast.show();
            } else {
                String DateiListe=null;
                File[] files = PfadObj.listFiles(); 
                for (int i = 0; i < files.length; i++) {
                     File file = files[i];
                     DateiListe = DateiListe +"\r\n" + file.getName();
                }
                TextView Anzeige= (TextView) findViewById(R.id.textView1);
                Anzeige.setText(DateiListe);                
            }

        }
    }
Und hier mein Manifest, falls ich spezielle Permission noch brauche:
Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.helloworld"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="16"
            android:targetSdkVersion="16" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.helloworld.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
Vielen Dank im Vorraus.

Gruß
Oliver
 
Zuletzt bearbeitet:
S

swordi

Enthusiast
Für SD Karte brauchst Perkussion read extern al storage.

Bitte schau dir mal die Java coding standards an. Dein code wird/ist unleserlich

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
O

olsvse

Neues Mitglied
Hallo zusammen,

Ich bin ein kleinen Schritt weitergekommen.
Mein Fehler war:

Code:
String Pfadangabe = (String) MyPfad.toString()einbinde.;
Richtig ist:
Code:
String Pfadangabe = (String) MyPfad.getText().toString();
Meinem Manifest habe ich folgendes hinzugefügt:
Code:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Jetzt fehlt mir nurnoch die info der richtige Hinweis wie ich die lib metadata-extractor-2.6.4.jar von:
drewnoakes.com - jpeg exif / iptc metadata extraction in java
einbinde.

@swordi:
Du sagst:
Bitte schau dir mal die Java coding standards an. Dein code wird/ist unleserlich
Kannst Du mir auf die schnelle sagen was da so falsch ist, dass Du schon jetzt sagen kannst das ich einen schlechten Programmierstiel habe?
Ich weis dass mein Programmierstiel nicht unbedingt der beste ist. Das sind Nachwirkungen von damals, als ich vor ca. 25 Jahren als ich das Programmieren mit BASIC lernte.

Vielend Dank schon mal im vorraus.

Gruß Oliver
 
ChrisiBoy

ChrisiBoy

Erfahrenes Mitglied
Und de externe sd hol dir bitte mit Environment.getExternalStorageDirectory();

Sent from my GT-I9100 using Android-Hilfe.de App
 
M

meganeura

App-Anbieter (gewerbl.)
ChrisiBoy schrieb:
Und de externe sd hol dir bitte mit Environment.getExternalStorageDirectory();
Leider nicht immer, aber ist schon mal besser als /mnt/sdcard zu verwenden.

Auf neueren Samsung Geräten wird bei getExternalStorageDirectory() aber leider eine Partition des internen Speichers zurückgeliefert. Diese Partition ist zwar mit den Rechten für externen Speicher schreibbar, aber das ist ein schwacher Trost wenn man eigentlich auf die SD-Karte schreiben will.
 
O

olsvse

Neues Mitglied
Danke für die Tips.

Und ich habe ein neues Samsung Galaxy Tab 2 (7").

Was würdet ihr empfehlen was ich anstatt /mnt/.... Für USB und SD-Card machen soll?
Das Lib-Problem habe ich gelöst bekommen:
1. einfach im Windows-Explorer mit einem Rechts-Klick auf "copy" in die Zwischenablage kopieren.
2. Dann zu ECLIPSE wechseln dort einen Rechtsklick auf den Lib-Ordner im Project das Kontextmenü aufrufen und mittels Paste einfügen. Jetzt wird die lib automatisch registriert und steht zu verfügung.

Das eigentliche kopieren habe ich auch schon hinbekommen.
Offen sind jetzt noch die Punkte wie ich ein Spinner-Widget mit unterverzeichnissen fülle und wie ich einen Progress-Bar richtig ansteure.
Brauche ich dazu unbedingt einen extra Thread wenn ich die Fortschrittsanzeige nur aktualisiere wenn eine Datei erfolgreich kopiert ist.

Gruß Oliver
 
O

olsvse

Neues Mitglied
Ich komme mit dem Spinner befüllen nicht richtig weiter.

Normal würde ich erwarten, mit dem auskommentierten Teil der Spinner das
selektierte Verzeichnis anzeigt, und in der TextEdit der zusammen gesetzte Pfad angezeigt wird.
Allerdings springt der Spinner zurück auf die ursprüngliche auswahl und ich bekomme die meldung dass alles OK ist und dann gleich das das Verzeichnis
"abc/def/./" nicht existiere.

Warum komt der zweite Aufruf?
Und warum wird die ItemSelected-Funktion schon beim Start aufgerufen ohne dass ich was gemacht habe?

Könnt ihr mir da helfen?

Danke.

Gruß
Oliver

Hier mein Code:
Code:
package de.dieseidels.apps.kamerabackup;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Date;
import java.text.SimpleDateFormat;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifIFD0Directory;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.content.res.Resources;

public class MainKameraBackupActivity extends Activity  implements OnItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_kamera_backup);

        Spinner quellSpinner = (Spinner) findViewById(R.id.spinner2);
        ArrayAdapter<String> quellAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        quellAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        quellSpinner.setAdapter(quellAdapter);
        quellAdapter.add(".");
        quellAdapter.add("..");
        
        EditText quellPfadEdit= (EditText) findViewById(R.id.editText2);
        String quellPfadangabeString = (String) quellPfadEdit.getText().toString();
        File quellPfadFile = new File(quellPfadangabeString);
        if (!quellPfadFile.exists()) {
             Toast fehlerMeldungToast = Toast.makeText(this, "Das Verzeichnis "+ quellPfadangabeString +" existiert nicht!", Toast.LENGTH_SHORT);
             fehlerMeldungToast.show();
             quellPfadangabeString = "/storage/";
             quellPfadEdit.setText(quellPfadangabeString);
             quellPfadFile = new File(quellPfadangabeString);
        } 
        String dateiListeString="Dateien im Quell-Verzeichnis:\r\n";
        File[] inhaltsListeFileArray = quellPfadFile.listFiles(); 
        File inhaltFile = null;
        for (int i = 0; i < inhaltsListeFileArray.length; i++) {
            inhaltFile = inhaltsListeFileArray[i];
            if (inhaltFile.isDirectory()) {
                quellAdapter.add(inhaltFile.getName().toString());
            }
            if (inhaltFile.isFile()){
                dateiListeString = dateiListeString +"\r\n" + inhaltFile.getName();
            }
        }
        
        
        Spinner zielSpinner = (Spinner) findViewById(R.id.spinner1);
        ArrayAdapter<String> zielAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        zielAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        zielSpinner.setAdapter(zielAdapter);
        zielAdapter.add(".");
        zielAdapter.add("..");
    
        
        EditText zielPfadEdit= (EditText) findViewById(R.id.editText1);
        String zielPfadangabeString = (String) zielPfadEdit.getText().toString();
        File zielPfadFile = new File(zielPfadangabeString);
        if (!zielPfadFile.exists()) {
             Toast fehlerMeldungToast = Toast.makeText(this, "Das Verzeichnis "+ zielPfadangabeString +" existiert nicht!", Toast.LENGTH_SHORT);
             fehlerMeldungToast.show();
             zielPfadangabeString = "/storage/";
             zielPfadEdit.setText(zielPfadangabeString);
             zielPfadFile = new File(zielPfadangabeString);
        } 
        dateiListeString=dateiListeString + "\r\n\r\nDateien im Ziel-Verzeichnis:\r\n";
        inhaltsListeFileArray = zielPfadFile.listFiles(); 
        inhaltFile = null;
        for (int i = 0; i < inhaltsListeFileArray.length; i++) {
            inhaltFile = inhaltsListeFileArray[i];
            if (inhaltFile.isDirectory()) {
                zielAdapter.add(inhaltFile.getName().toString());
            }
            if (inhaltFile.isFile()){
                dateiListeString = dateiListeString +"\r\n" + inhaltFile.getName();
            }
        }
        
        TextView Anzeige = (TextView) findViewById(R.id.textView3);
        Anzeige.setText(dateiListeString);                
        
        zielSpinner.setOnItemSelectedListener(this);
        quellSpinner.setOnItemSelectedListener(this);
        
    }

    
    
    
    @Override
    public void onItemSelected(AdapterView<?> parent, View myview, int pos, long id){
        String welcherSpinner = parent.getTag().toString();
        String zielSpinnerString =getResources().getString(R.string.spinner1_tag_String);
        Spinner setSpinner=null;
        EditText setPfadEdit=null;
        if (welcherSpinner == zielSpinnerString){
            setSpinner = (Spinner) findViewById(R.id.spinner1);
            setPfadEdit= (EditText) findViewById(R.id.editText1);
        }
        else{
            setSpinner = (Spinner) findViewById(R.id.spinner2);
            setPfadEdit= (EditText) findViewById(R.id.editText2);
        }
        String ausgewaehltesVerzeichnis = parent.getItemAtPosition(pos).toString();
        String altePfadangabe = (String) setPfadEdit.getText().toString();
        String setPfadangabeString =  altePfadangabe+ausgewaehltesVerzeichnis+"/";
        setPfadEdit.setText(setPfadangabeString);
        setSpinner.setSelection(0);    
        File setPfadFile = new File(setPfadangabeString);
        if (!setPfadFile.exists() || ausgewaehltesVerzeichnis==".") {
             Toast fehlerMeldungToast = Toast.makeText(this, "Das Verzeichnis "+ setPfadangabeString +" existiert nicht!", Toast.LENGTH_SHORT);
             fehlerMeldungToast.show();             
             TextView Anzeige = (TextView) findViewById(R.id.textView3);
             String dateiListeString = Anzeige.getText().toString()+"\r\n"+welcherSpinner+" --> "+setPfadangabeString; 
              Anzeige.setText(dateiListeString);
             setPfadangabeString = altePfadangabe;
             setPfadEdit.setText(altePfadangabe);
             setPfadFile = new File(altePfadangabe);
        } else {
             TextView Anzeige = (TextView) findViewById(R.id.textView3);
             dateiListeString = Anzeige.getText().toString()+"\r\n"+welcherSpinner+" --> "+setPfadangabeString + " ==> Alles OK."; 
              Anzeige.setText(dateiListeString);
        }
/*        ArrayAdapter<String> setAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        setAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        setSpinner.setAdapter(setAdapter);
        setAdapter.add(".");
        setAdapter.add("..");
          String dateiListeString="Dateien im ausgewählten Verzeichnis:\r\n";
        File[] inhaltsListeFileArray = setPfadFile.listFiles(); 
        File inhaltFile = null;
        for (int i = 0; i < inhaltsListeFileArray.length; i++) {
            inhaltFile = inhaltsListeFileArray[i];
            if (inhaltFile.isDirectory()) {
                setAdapter.add(inhaltFile.getName().toString());
            }
            if (inhaltFile.isFile()){
                dateiListeString = dateiListeString +"\r\n" + inhaltFile.getName();
            }
        }        
        TextView Anzeige = (TextView) findViewById(R.id.textView3);
        Anzeige.setText(dateiListeString);    */            
    }
    
    @Override
    public void onNothingSelected(AdapterView<?> parent){
        // Nichts zu tun.
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_kamera_backup, menu);
        return true;
    }

}
 
Ähnliche Themen - Zugriff auf Bilder auf der SD-Karte und dem USB-Speicher Antworten Datum
3
0