Dummy Aktivität für Übungskatalog

  • Antworten:19
Christian Auner
  • Forum-Beiträge: 18

19.05.2015, 17:32:41 via Website

Hallo Leute,

ich bin neu hier und hoffe das ich in dem Bereich richtig bin.

Bei der Entwicklung meiner ersten eigenen App für ein Uni-Modul habe ich ein paar verständnis Fragen.

Ich möchte eine vereinfachte Fitness-App erstellen.
Der Katalog an Fitness Übungen soll die einzelnen Übungen enthalten die dann Detailiert aufgerufen werden können.

Für jede Übung soll es ein oder mehrere bilder geben und dann eine Beschreibung und natürlich einen Namen.

Die Frage:

Erstelle ich eine Dummy Aktivität für alle Übungen und suche dann am besten über eine Datenbank id_namen, image_link und lasse dann die Dummy Aktivität immer neu schreiben?

Oder muss ich für jede Übung eine einzelne Aktivität erstellen??

Das wars erstmal, weiteres folgt bestimmt :D

Grüße
Und Danke

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.05.2015, 18:22:04 via App

Hallo Chistian,
Herzlich wilkommen hier im Forum :)
Ich habe deinen Thread mal in den Entwicklerbereich verschoben.

Ich würde das mit einer Activity bzw. Fragment lösen. Da jeder Datensatz die gleiche Struktur hat musst du dann immer nur anderen Text +Bilder laden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

29.05.2015, 14:19:49 via Website

danke das habe ich auch schonmal vorbereitet, im moment hänge ich gerade an einem Problem:

Wenn ich Bilder aus der Galerie lade und sie als Uri in eine Datenbank speicher. Zeigt er mit das Bild nach dem auswählen in der ImageView an aber wenn ich dann dieses Bild aus der Datenbank in eine geänderte ListView laden will kann er die Uri nicht laden.

Hier der Code dazu.

ADDActivity(Hier wird das Bild ausgewählt und dem ImageView in der ADDActivity hinzugefügt und data.getData() wird als Uri in imageMain gespeichert. (geht dann in ein Objekt)

So sieht das Standart Uri aus und das wird auch nicht geladen: Uri imageMain = Uri.parse("android.resource://com.fitness.christian.fitness/drawable/dummy.png");

uebImageMainUri.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Main Pic"), 1);
        }
    });

}

public void onActivityResult(int reqCode, int resCode, Intent data){
    if(resCode == RESULT_OK){
        if(reqCode==1){
            imageMain = data.getData();
            InputStream inputStream;
            try {
                inputStream = getContentResolver().openInputStream(imageMain);
                Bitmap image = BitmapFactory.decodeStream(inputStream);
                uebImageMainUri.setImageBitmap(image);
                Log.d("image", String.valueOf(image));


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

        }
    }
}

Hier wird die ListView bearbeitet und über den Adapter gefühlt. das ImageView in der ListView(ivUebMain) und wenn ich die URI so laden will kann der das Image nicht laden. currentUebung ist eine Liste von allen Übungen

 public View getView(int position, View view, ViewGroup parent) {

        if (view == null) {
            view = getLayoutInflater().inflate(R.layout.single_row, parent, false);
        }
        //Notwendig??
        dbHelper.updateUebList();

        Uebung currentUebung = dbHelper.uebList.get(position);
        Log.d("Titel",currentUebung.get_titel());
        Log.d("Uri",String.valueOf(currentUebung.get_imageMainUri()));

        TextView title = (TextView) view.findViewById(R.id.uebTitel);
        title.setText(currentUebung.get_titel());

        ImageView ivUebMain = (ImageView) view.findViewById(R.id.ivUebMain);

        ivUebMain.setImageURI(currentUebung.get_imageMainUri());

        return view;
    }

Hat vielleicht jemand eine Idee wie ich an der Stelle die Uri laden kann??

Grüße und Danke

Antworten
Christian Auner
  • Forum-Beiträge: 18

29.05.2015, 14:33:30 via Website

05-29 14:30:37.590 20468-20468/com.fitness.christian.fitness E/BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: android.graphics.Bitmap@2250de9: open failed: ENOENT (No such file or directory)

05-29 14:30:37.590 20468-20468/com.fitness.christian.fitness I/System.out﹕ resolveUri failed on bad bitmap uri: android.graphics.Bitmap@2250de9

Das sind die Fehler die kommen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.05.2015, 10:44:26 via App

Sieht so aus als findet er den File nicht bzw. kann ihn nicjt dekpdieren. Wie sieht denn die URI aus die du aus der DB bekommst? Ausgeben tutst du das ja schon. Poste mal was herauskommt. Und wie speicherst du due Daten in der DB vlt stimmt da was nicht.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

01.06.2015, 13:58:56 via Website

Das wird für das Dummy Objekt gespeichert:
D/Uri﹕ android.resource://com.fitness.christian.fitness/mipmap/dummy.png/dummy.png

Das wird für das ausgewählte Bild gespeicher:
D/Uri﹕ content://com.android.providers.media.documents/document/image%3A14685

Wenn ich das Bild das erste mal hinzufüge wird es auch angezeigt in der costum ListView, wenn ich die App schließe wird es nicht mehr angezeigt.

— geändert am 01.06.2015, 13:59:58

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.06.2015, 21:39:37 via Website

Damit kann ich jetzt rein garnichts anfagen, aber ich nertnehme dass du die Daten Appspezifisch speicherst und nich auf der SD card.
Hat das irgend einen sinn?
Und tut der Pfad vor dem speichern in der DB?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 15:41:39 via Website

ich speicher keine Daten Appspezifisch. ich habe nur das Dummy Bild was im drawable liegt und den rest nehme ich einfach aus der Gallery.

gibt es denn andere Möglichkeiten die Bilder einzulesen und wieder aufzurufen? oder muss ich die vielleicht noch skalieren?
Komisch ist ja das er sie beim ersten einlesen in der ListView anzeigt.

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 16:13:36 via Website

Wenn ich es dann in der ListView so probiere:

Uebung currentUebung = dbHelper.uebList.get(position);
        Log.d("Titel",currentUebung.get_titel());
        Log.d("Uri",String.valueOf(currentUebung.get_imageMainUri()));

        TextView title = (TextView) view.findViewById(R.id.uebTitel);
        title.setText(currentUebung.get_titel());

        try {
        ImageView ivUebMain = (ImageView) view.findViewById(R.id.ivUebMain);

        InputStream inputStream = getContentResolver().openInputStream(currentUebung.get_imageMainUri());
        Bitmap image = BitmapFactory.decodeStream(inputStream);

        ivUebMain.setImageBitmap(image);

        } catch (FileNotFoundException e) {
            e.printStackTrace();

        }
        return view;
    }

Dann hat er Probleme mit der Zeile: InputStream inputStream = getContentResolver().openInputStream(currentUebung.get_imageMainUri());

Fehler: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{3a9393c0 22270:com.fitness.christian.fitness/u0a160} (pid=22270, uid=10160) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

Uri Link: D/Uri﹕ content://com.android.providers.media.documents/document/image%3A14674

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.06.2015, 16:14:31 via App

Das Dummy Bild änders sich ja nicht also musst du dazu den Pfad nicht speichern sonsern einfych die ResId als Placeholder hardcoden. In der Db würde ich den bildpfad speichern a la :
/sdcard/DCIM/Camera/irgendEinBilg.jpg

Edit: Deine URI stimmt nicht wie erzeuvst du diese?

— geändert am 02.06.2015, 16:15:44

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 17:00:08 via Website

    Uri imageMain = Uri.parse("android.resource://com.fitness.christian.fitness/drawable/dummy.png");

    ImageView uebImageMainUri;
    uebImageMainUri = (ImageView) findViewById(R.id.ivMain);
    uebImageMainUri.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Main Pic"), 1);
        }
    });

}

public void onActivityResult(int reqCode, int resCode, Intent data){
    if(resCode == RESULT_OK){
        if(reqCode==1){
            imageMain = data.getData();
            InputStream inputStream;
            try {
                inputStream = getContentResolver().openInputStream(imageMain);
                Bitmap image = BitmapFactory.decodeStream(inputStream);
                uebImageMainUri.setImageBitmap(image);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

        }
    }

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.06.2015, 17:03:58 via App

Schon aber hier speicherst du die URI nicht in der DB. Auserdem würde ich lieber mit relativen Pfaden zur SDCard arbeiten als mit ContentResolver und android:content uris. Beim Dummypicture kannste das ja machen aber nicht bei SDCard Pfaden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 17:15:19 via Website

imageMain wird nach data.getData() so in die Datenbank geschrieben.

Ich weiß leider zur Zeit gar nicht wie ich an der Stelle weiter komme. wie meinst du das mit relativen Pfaden? wie kann ich die vom ausgewählen Bild bekommen?

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 17:24:31 via Website

geht das mit diesem Befehl?

           public class RealPathUtil {

@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri){
    String filePath = "";
    String wholeID = DocumentsContract.getDocumentId(uri);

     // Split at colon, use second item in the array
     String id = wholeID.split(":")[1];

     String[] column = { MediaStore.Images.Media.DATA };     

     // where id is equal to             
     String sel = MediaStore.Images.Media._ID + "=?";

     Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                               column, sel, new String[]{ id }, null);

     int columnIndex = cursor.getColumnIndex(column[0]);

     if (cursor.moveToFirst()) {
         filePath = cursor.getString(columnIndex);
     }   
     cursor.close();
     return filePath;
}

dann kann ich ja am besten den String direkt in der db speichern.

Übrigens, das mit dem Dummy Bild geht auch nicht....also war das auch ne schlechte Option.

— geändert am 02.06.2015, 17:29:47

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.06.2015, 17:25:13 via App

Ich habe sowas hier schonmal geschrieben. https://www.nextpit.de/forum/653729/eigenes-bild-in-email-einfuegen/page/1#2478154

Das gibt dir den Pfad zur SdCard aus wo das bild liegt. Zusammen mit der Permission für externes File lesen solltest du die Datei laden u d anzeigen können

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.06.2015, 17:26:51 via App

Und das Dummy bild nicht über die DB lasen sondern als standard Bild über die resID also imgView.setDrawable(R.drawable.dummy)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 18:05:11 via Website

ja das ist ungefähr das selbe was ich auch gefunden habe. ich habe nur irgendwie ein berechtigungsproblem.

vielleicht findest du ja einen Fehler in meiner Manifest
Und bei dem vorschlag mit dem Dummy musste ich grad lachen, warum mach ich es auch so kompliziert :D danke....

Sorry kann die Manifest nur als Bild hochladen...er meckert wegen angeblichen Emails
--> achja die Zeile : uses-permission android:name="android.permission.MANAGE_DOCUMENTS" schmeißt er immer raus sobald ich starte

image

— geändert am 02.06.2015, 18:06:42

Antworten
Christian Auner
  • Forum-Beiträge: 18

02.06.2015, 18:31:05 via Website

das kommt:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{2f3c3ca2 3061:com.fitness.christian.fitness/u0a160} (pid=3061, uid=10160) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

Für die Zeile: ivUebMain.setImageURI(currentUebung.get_imageMainUri());

Die Uri habe ich an der Stelle gespeichert imageMain = Uri.fromFile(new File(realPath));


habe es gerade nochmal probiert... für die alten angelegten Übungen geht es nocht.
Hab gerade mal eine neue Hinzugeführt und angezeigt --> da ging es
Dann App gekillt cache gelöscht und ---> es geht immernoch

ich glaube es könnte so schon funktionieren.
Hab das Handy auch neu gestartet und das ild ist zu sehen...juhu.

Ich danke dir erstmal für deinen Support
Es werden bestimmt noch weitere Fragen kommen ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.06.2015, 18:39:23 via Website

Ja du musst wenn svhon alles Umstellen, sonst ist klar dass etwas nicht tut ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten