problema Null-pointer la visualizzazione di un'immagine da attività cartella di Android 2.2 SDK

StackOverflow https://stackoverflow.com/questions/4038597

  •  27-09-2019
  •  | 
  •  

Domanda

Ho guardato il 2 esempi sulla pila, ma non può andare al lavoro. Sto semplicemente cercando di catturare un'immagine da una cartella in attività e impostarlo come in ImageView, ma ottenere un puntatore nullo restituito. Che cosa sto facendo di sbagliato?

attività principale:     pacchetto 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;

    }

}

e le mie due file 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

Layout>

<?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:

provato anche questo, ma ancora ottenere un file non trovato eccezione.

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;

    }
È stato utile?

Soluzione

In caso di "file:///android_asset/Samples/" + imageName proviene? Se il tuo aspetto di gerarchia come attività / file_name.jpg, si sarebbe solo chiamare open(file_name.jpg). In altre parole, provare a sostituire il vostro file:///android_asset/Samples/" + imageName con appena imageName.

Controlla l'API Demos, in particolare la classe ReadAsset.java:

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

...

in cui le attività delle cartelle assomiglia

alt text

Altri suggerimenti

Frank Ho avuto lo stesso problema!

Ho avuto le mie immagini PNG all'interno di "attività" del mio progetto e AssetManager.open () tenuti a darmi un'eccezione, perché non riusciva a trovare il file!

I investigato utilizzando assetManager.list ( "") alla lista che cosa è in "attività". In seguito ho scoperto che le mie immagini sono state in realtà NON aggiunti alle "attività"!

Come potete immaginare mi è stato sempre abbastanza incazzato a questo punto perché, ovviamente, le mie immagini delle cartelle di dovrebbe sono stati tra le attività perché ho potuto vederli giocare come il giorno in Eclipse all'interno delle "attività" maledetti il mio progetto.

Soluzione

  1. back-up dei file che si trovano in attività cartella del vostro progetto. Ho usato di Windows Explorer per questa operazione di trascinamento della selezione.
  2. tornare ad eclissare ed eliminare i file all'interno di "attività". Utilizzare Eclipse per questo in modo che non è necessario per aggiornare il vostro progetto.
  3. ottenere la vostra finestra posteriore di Windows Explorer e trascinare i file di backup in Eclipse e sul "attività". Il cursore si trasforma in una "+". Quando si lascia andare del pulsante del mouse Eclipse vi verrà chiesto se si desidera collegare o copiare. Selezionare la copia.
  4. ricostruire il progetto e le immagini sono ora veramente in attività.

Bonus - metodo che ho aggiornato il getBitmapFromAsset ():

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

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

    return bitmap;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top