Bla gjennom Androids mediegalleri via hensikt

For noen uker siden skrev jeg et innlegg om å dra nytte av det innebygde kameraet på en Android-enhet for å ta bilder inne i appen din. Jeg trodde det var et ganske kjipt triks (katten min ble mindre imponert), men det fører til det åpenbare spørsmålet: Hva om du bare vil bla gjennom enheten din etter et eksisterende bilde og jobbe med det i aktiviteten din?

Aldri frykt! Gjennom underverkene med Android’s kraftige intensjonsregistreringssystem er det enkelt å kamme SD-kortet for bilder. Og best av alt, kilden til disse bildene er ikke viktig. Det betyr at om du leter etter bilder fra kameraet, utklipp som er lastet ned i nettleseren, eller grafer som er lastet til telefonen din direkte fra en PC, er alle disse bildene tilgjengelige for og av appen din.

Denne ukens demo lar deg bla gjennom, velge og vise et eksisterende bilde på SD-kortet. Du kan følge med trinnvis veiledning, eller laste ned hele prosjektet og importere det direkte til Eclipse.

1. Lag et nytt Android-prosjekt i Eclipse. Målrette Android 1.6 eller nyere. Sørg for å gi nytt navn til oppstartsfilen til Main.java.

2. Opprett en ny layoutfil for main.xml i mappen / res / layout. For dette prosjektet vil vi bruke en lineær layout som har en enkel tekstvisning, en enkelt knapp og en bildevisning. For nå, la oss peke bildevisningskilden til programmets ikonfil.

 main.xml 

"Http://schemas.android.com/apk/res/android"

android: layout_width = "fill_parent"

android: layout_height = "fill_parent"

android: orientering = "vertikal" >
 android: layout_width = "fill_parent" android: layout_height = "wrap_content" 
 android: gravity = "center" android: layout_margin = "10dip" android: text = "Gallery Browser Demo" /> 
android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: text = "Finn et bilde" android: layout_gravity = "center" android: layout_margin = "10dip" android: id = "@ + id / browse_button" />
 "fill_parent" android: layout_height = "wrap_content" android: gravity = "center" android: scaleType = "centerInside" android: src = "@ drawable / ic_launcher" android: id = "@ + id / image_holder" /> 

3. Flytt til filen vår / src og begynn å jobbe i Main.java-filen. For å starte, vil vi definere et par statiske konstanter og koble opp vår søkeknapp.

 Main.java- pakke com.authorwjf.pic_viewer; 
 import java.io.InputStream; 
 import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.app.Aktivitet; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; 
 public class Main utvider aktivitetsredskaper OnClickListener { 
 privat statisk endelig int REQUEST_ID = 1; privat statisk finale int HALF = 2; 
 @Override offentlig tomrom onCreate (Bundle savedInstanceState) { super .onCreate (savedInstanceState); 

setContentView (R.layout. main );

findViewById (R.id. browse_button ) .setOnClickListener ( dette ); }
 } 

4. La oss overstyre behandleren for klikk. Her bruker vi Androids allsidige intensjonsmekanisme for å la brukeren velge ethvert program som har registrert seg i operativsystemet som i stand til å vise bildefiler. Vi bruker startaktivitet for resultatmetode slik at galleri-applikasjonen kan returnere URI til det valgte bildet.

 @Override offentlig tomrom onClick (Vis v) {Intent intention = new Intent (); 

intention.setAction (Intent. ACTION_GET_CONTENT );

intent.addCategory (Intens. CATEGORY_OPENABLE );

intent.setType ( "image / *");

startActivityForResult (hensikt, REQUEST_ID );

}
5. Det siste trinnet er det vanskeligste. I tilbakekalling av aktivitetsresultat laster vi ikke bare et bitmap, men før vi tilordner det til widgeten, blir bildet nedskalert med 50%. Et advarsel: Du trenger ikke å skalere bitmappen med halvparten; Imidlertid, hvis bitmappen er for stor (og mange av bildene jeg prøvde var), mislykkes applikasjonen lydløst. Det var veldig frustrerende, og jeg brukte mye tid på å snurre hjulene mine med å prøve å feilsøke problemet. Vanligvis gjør Android-rammeteknikerne en god jobb mellom å kaste unntak og spytte ut loggkattmeldinger og la utviklere vite hva som skjer. I dette tilfellet droppet noen ballen.
 @Override beskyttet tomrom onActivityResult ( int requestCode, int resultCode, Intent data) {InputStream stream = null ; if (requestCode == REQUEST_ID && resultCode == Activity. RESULT_OK ) { prøv { 

stream = getContentResolver (). openInputStream (data.getData ());

Bitmap original = BitmapFactory. dekodeStream (strøm);
 ((ImageView) findViewById (R.id. Image_holder )). SetImageBitmap (Bitmap. CreateScaledBitmap (original, original.getWidth () / HALF, original.getHeight () / HALF, sant )); } fangst (unntak e) { 

e.printStackTrace ();

}

if (stream! = null ) { prøv {

stream.close ();

} fangst (unntak e) {

e.printStackTrace ();

}

}

}

}
Med skaleringsproblemet bak oss er vi klare til å lansere appen vår. Merk: Det er problemer med kompatibilitet med noen tilfeller av emulatoren, så jeg anbefaler å kjøre demoen på en fysisk enhet.

Jeg håper du likte å grave litt dypere i Android-intensjonsmekanismen. Hvis du ikke har gjort det ennå, oppfordrer jeg deg til å lese alle de gory detaljene på Googles offisielle Android-utviklerside.

© Copyright 2021 | pepebotifarra.com