Gennemse Android's mediegalleri via intentioner

For et par uger siden skrev jeg et indlæg om at drage fordel af det indbyggede kamera på en Android-enhed til at fange fotos inde i din app. Jeg troede, det var et smukt trick (min kat var mindre imponeret), men det fører til det åbenlyse spørgsmål: Hvad hvis du bare vil søge på din enhed efter et eksisterende billede og arbejde med det i din aktivitet?

Frygt aldrig! Gennem undrene ved Android's kraftfulde intensionsregistreringssystem er det nemt at kamme SD-kortet til billeder. Og bedst af alt, kilden til disse billeder er ikke vigtig. Det betyder, uanset om du leder efter fotos fra kameraet, clipart, der er hentet i browseren, eller grafer, der er indlæst på din telefon direkte fra en pc, alle disse billeder er tilgængelige for og af din app.

Denne uges demo giver dig mulighed for at gennemse, vælge og vise et eksisterende billede på dit SD-kort. Du kan følge med i trinvis vejledning eller downloade hele projektet og importere det direkte til Eclipse.

1. Opret et nyt Android-projekt i Eclipse. Mål mod Android 1.6 eller nyere. Sørg for at omdøbe din startfil til Main.java.

2. Opret en ny main.xml-layoutfil i mappen / res / layout. Til dette projekt vil vi bruge et lineært layout, der har en enkel tekstvisning, en enkelt knap og en billedvisning. Lad os nu pege billedvisningskilden til applikationens ikonfil.

 main.xml 

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

android: layout_width = "fill_parent"

android: layout_height = "fill_parent"

android: orientering = "lodret" >
 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 = "Find et foto" 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. Gå til vores / src-fil, og begynd at arbejde i Main.java-filen. For at starte, definerer vi et par statiske konstanter og trækker op vores browserknap.

 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 udvider Aktivitetsimplementeringer OnClickListener { 
 privat statisk endelig int REQUEST_ID = 1; privat statisk endelig int HALF = 2; 
 @Override offentligt tomrum onCreate (Bundle gemtInstanceState) { super .onCreate (gemtInstanceState); 

setContentView (R.layout. main );

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

4. Lad os tilsidesætte on-click handler. Her bruger vi Android's alsidige hensigtsmekanisme for at give brugeren mulighed for at vælge ethvert program, der er registreret med operativsystemet som i stand til at vise billedfiler. Vi bruger startaktiviteten til resultatmetode, så galleri-applikationen kan returnere URI for det valgte billede.

 @Override offentligt ugyldigt onClick (Vis v) {Intent intention = new Intent (); 

intention.setAction (Hensigt. ACTION_GET_CONTENT );

intention.addCategory (Hensigt. CATEGORY_OPENABLE );

intent.setType ( "image / *");

startActivityForResult (intention, REQUEST_ID );

}
5. Det sidste trin er det vanskeligste. I tilbagekaldet til aktivitetsresultatet indlæser vi ikke kun en bitmap, men inden tildelingen af ​​den til widgeten, skaleres billedet ned med 50%. Et advarselsord: Du behøver ikke at skalere bitmappen med halvdelen; Hvis bitmappen dog er for stor (og mange af de fotos, jeg prøvede var), mislykkes applikationen lydløst. Det var meget frustrerende, og jeg brugte en masse tid på at spinde mine hjul på at prøve at debug problemet. Normalt gør Android-rammeteknikerne et godt stykke arbejde mellem at kaste undtagelser og spytte ud logkatte-beskeder og lade udviklerne vide, hvad der sker. I dette tilfælde faldt nogen bolden.
 @Override beskyttet tomrum onActivityResult ( int requestCode, int resultCode, Intent data) {InputStream stream = null ; if (requestCode == REQUEST_ID && resultCode == Aktivitet. RESULT_OK ) { prøv { 

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

Bitmap original = BitmapFactory. dekodeStream (stream);
 ((ImageView) findViewById (R.id. Image_holder )). SetImageBitmap (Bitmap. CreateScaledBitmap (original, original.getWidth () / HALF, original.getHeight () / HALF, sand )); } fangst (undtagelse e) { 

e.printStackTrace ();

}

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

stream.close ();

} fangst (undtagelse e) {

e.printStackTrace ();

}

}

}

}
Med skaleringsproblemet bag os er vi klar til at starte vores app. Bemærk: Der er problemer med kompatibilitet med nogle tilfælde af emulatoren, så jeg anbefaler at køre demoen på en fysisk enhed.

Jeg håber, at du nød at grave lidt dybere i Android-intensionsmekanismen. Hvis du endnu ikke har gjort det, opfordrer jeg dig til at læse alle de gory-detaljer på Googles officielle Android-udvikler-side.

© Copyright 2021 | pepebotifarra.com