2016-05-30 9 views
0

Ich versuche, Hintergrundbild aus Dateipfad festlegen. Allerdings dauert es mehr als 10 Sekunden und die App reagiert nicht mehr.Android - Festlegen von Hintergrundbild aus Dateipfad dauert länger als erwartet

Hier ist der Code, den ich mit:

public void SET_WALLPAPER_FROM_FILE_PATH (String file_path) 
{ 
    Bitmap image_bitmap; 
    File image_file; 
    FileInputStream fis; 

    try { 
     WallpaperManager wallpaper_manager = WallpaperManager.getInstance(m_context); 
     image_file       = new File(file_path); 
     fis        = new FileInputStream(image_file); 
     image_bitmap      = BitmapFactory.decodeStream(fis); 

     wallpaper_manager.setBitmap(image_bitmap); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

ich versucht habe, zu verwenden:

wallpaper_manager.setStream(fis)

statt:

wallpaper_manager.setBitmap(image_bitmap);

wie in this answer vorgeschlagen aber könnte nicht lade die Tapete nicht.

Kann mir jemand helfen?

Dank

+0

allererst Sie Bild im Hintergrund-Thread entschlüsseln muss. Und möglicherweise müssen Sie Bild mit einigen Optionen wie inSampleSize dekodieren –

+0

Gibt es Klasse oder Dokumentation dafür? –

Antwort

1

Try AsyncTask zu verwenden, in doInBackground Methode etwas schreiben wie diese

public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){ 
    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //The new size we want to scale to 
     final int REQUIRED_WIDTH=WIDTH; 
     final int REQUIRED_HIGHT=HIGHT; 
     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT) 
      scale*=2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } 
     catch (FileNotFoundException e) {} 
    return null; 
} 
+0

Ich habe es in einem Thread gestartet, benutzte die Funktion, alles scheint perfekt, aber es dauert noch 4-5 Sekunden, um die Tapete zu laden. Gibt es eine tatsächliche Lösung dafür? –

+0

Ja, es ist in Ordnung. Großes Bild decodieren ist schwieriger Betrieb. Es hängt also von der Größe ab - je kleiner die Größe, desto schneller wird es ausgeführt –

Verwandte Themen