2010-10-27 3 views
0

J'ai regardé les 2 exemples sur Stack, mais je n'arrive pas à les faire fonctionner. J'essaie simplement de récupérer une image d'un dossier dans les éléments et de la définir comme dans ImageView, mais je renvoie un pointeur null. Qu'est-ce que je fais mal?Problème de pointeur NULL affichant une image du dossier des actifs Android 2.2 SDK

Activité principale: package com.xxx.xxx;

import java.io.InputStream; 

import android.app.AlertDialog; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.view.View; 
import android.view.Window; 
import android.widget.ImageView; 
import android.widget.ViewFlipper; 

public class SamplesViewFlipper extends SamplesViewCreator { 

    private Bitmap returnedImage; 
    ImageView imgView; 
    ViewFlipper vf; 
    private String imageName = "testImage.png"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     returnedImage = getImageFromAsset(imageName); 

     imgView = (ImageView) findViewById(R.id.dynamicImageView); 
     imgView.setImageBitmap(returnedImage); //<-null pointer happens here 

     vf = (ViewFlipper) findViewById(R.id.SamplesViewFlipper); 
     setContentView(R.layout.view_flipper_samples); 

    } 

    public void buttonClickHandler(View view) { 

     switch (view.getId()) { 

      case R.id.nextSampleButton: 

       vf.showNext(); 

       break; 

      case R.id.backSampleButton: 

       vf.showPrevious(); 

       break; 

     } 

    } 

} 

Extender Classe:

package com.xxx.xxx; 

import java.io.IOException; 
import java.io.InputStream; 

import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

public class SamplesViewCreator extends Activity { 

    private InputStream is; 
    private Bitmap bitmap; 

    public Bitmap getImageFromAsset(String imageName) { 

     AssetManager mngr = getAssets(); 
     try { 

      is = mngr.open("file:///android_asset/Samples/" + imageName); 
      bitmap = BitmapFactory.decodeStream(is); 
        //also tried "Files/" + imageName per example on Stack 

     } catch (final IOException e) { 

      e.printStackTrace(); 

     } 

     return bitmap; 

    } 

} 

Et mes deux fichiers xml:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/SamplesLayout" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <RelativeLayout 
     android:id="@+id/samples_menu" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:gravity="center" 
     android:background="#0061F9"> 
     <Button android:id="@+id/nextSampleButton" 
      android:layout_marginRight="10dp" 
      android:gravity="center"  
      android:layout_width="50dp" 
      android:layout_height="30dp" 
      android:text="Next" 
      android:textColor="#FFFFFF" 
      android:textSize="13dp" 
      android:layout_weight="1" 
      android:background="@drawable/button" 
      android:layout_alignParentRight="true" 
      android:onClick="buttonClickHandlerSamples"/> 
     <Button android:id="@+id/backSampleButton" 
      android:layout_marginLeft="10dp" 
      android:gravity="center"  
      android:layout_width="50dp" 
      android:layout_height="30dp" 
      android:text="Back" 
      android:textColor="#FFFFFF" 
      android:textSize="13dp" 
      android:layout_weight="1" 
      android:background="@drawable/button" 
      android:onClick="buttonClickHandler"/> 
    </RelativeLayout> 
    <LinearLayout android:id="@+id/SamplesViewFlipperLayout" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"> 
     <ViewFlipper android:id="@+id/SamplesViewFlipper" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"> 
      <!--adding views to ViewFlipper--> 
      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:paddingLeft="@dimen/header_pad_left" 
       android:paddingRight="@dimen/header_pad_right" 
       android:paddingBottom="@dimen/header_pad_bot" 
       android:paddingTop="@dimen/header_pad_top" 
       android:orientation="vertical" 
       android:background="@color/background" > 

      </LinearLayout> 
     </ViewFlipper> 
    </Linear 

Mise en page>

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dynamicImageView" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:src="@drawable/default_samples_image"/> 

EDIT:

Également essayé ceci, mais obtenez toujours une exception de fichier non trouvé.

Public Bitmap getImageFromAsset() throws IOException { 

     try { 

      is = getAssets().open("test3.png"); 

        bitmap = BitmapFactory.decodeStream(is); 

     } catch (final IOException e) { 

      e.printStackTrace(); 

     } 

     System.out.println("bitmap is " + bitmap); 
     return bitmap; 

    } 
+1

Où exactement vous obtenez le nul? – EboMike

+0

Je suppose que votre chemin n'est pas correct. Avez-vous essayé d'utiliser un chemin relatif? AssetManager.list peut vous donner des informations utiles. – elevine

+0

Le pointeur NULL se trouve dans les commentaires, essentiellement dans imgView.setImageBitmap (returnsImage), car l'image renvoie null. –

Répondre

2

D'où provient "file:///android_asset/Samples/" + imageName? Si votre hiérarchie ressemble à assets/nom_fichier.jpg, vous devez simplement appeler open(file_name.jpg). En d'autres termes, essayez de remplacer votre file:///android_asset/Samples/" + imageName avec juste imageName.

Vérifiez les démos API, plus particulièrement la classe ReadAsset.java:

try { 
     InputStream is = getAssets().open("read_asset.txt"); 

...

où le dossier actif ressemble

alt text

+0

Essayé cela, mais toujours obtenir une exception fichier non trouvé. –

+0

Si votre fichier est sous actif/Samples, vous appelez probablement open ("Samples/read_asset.txt") – I82Much

+0

Ajout du code que j'ai essayé en bas de la publication. –

2

Frank J'ai eu la même problème !

J'avais mes images PNG dans les "assets" de mon projet et AssetManager.open() a continué à me donner une exception car il ne pouvait pas trouver le fichier!

J'ai étudié en utilisant assetManager.list ("") pour lister ce qu'il y a dans "assets". J'ai ensuite découvert que mes images n'étaient en fait PAS ajoutées aux "assets"!

Comme vous pouvez l'imaginer, je recevais assez énervé à ce moment car il est évident mes images devraient ont été dans les actifs parce que je pouvais voir jouer comme jour dans Eclipse dans le putain de dossier « actifs » de mon projet.

Solution

  1. le back-up des fichiers qui sont dans le dossier actif de votre projet. J'ai utilisé Windows Explorer pour cette opération glisser-déposer.
  2. retournez à Eclipse et supprimez vos fichiers dans "assets". Utilisez Eclipse pour cela afin de ne pas avoir besoin d'actualiser votre projet.
  3. récupérez votre fenêtre Windows Explorer et faites glisser vos fichiers sauvegardés dans Eclipse et sur "assets". Votre curseur se transforme en "+". Lorsque vous relâchez le bouton de votre souris, Eclipse vous demande si vous voulez lier ou copier. Sélectionnez la copie.
  4. reconstruire votre projet et les images sont maintenant vraiment actifs.

Bonus - Je mis à jour votre méthode getBitmapFromAsset():

private Bitmap getBitmapFromAsset(String strName) throws IOException 
{ 
    AssetManager assetManager = getAssets(); 

    InputStream istr = assetManager.open(strName); 
    Bitmap bitmap = BitmapFactory.decodeStream(istr); 

    return bitmap; 
} 
+0

notez que getAssets() a besoin d'un contexte qui est facilement disponible dans une activité. –

+1

solution supplémentaire: au lieu d'effectuer les étapes 1 à 3 ci-dessus, nettoyez simplement le projet. –