2016-05-30 2 views
0

J'essaie de définir le fond d'écran à partir du chemin du fichier. Cependant, cela prend plus de 10 secondes et provoque le blocage de mon application.Android - La configuration du fond d'écran à partir du chemin de fichier prend plus de temps que prévu

Voici le code que je utilise:

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(); 
    } 
} 

J'ai essayé d'utiliser:

wallpaper_manager.setStream(fis)

au lieu de:

wallpaper_manager.setBitmap(image_bitmap);

comme suggéré dans this answer mais couldn pas charger le fond d'écran.

Quelqu'un peut-il me guider?

Merci

+0

Tout d'abord, vous devez décoder l'image en fil d'arrière-plan. Et peut-être avez-vous besoin de décoder l'image avec certaines options comme inSampleSize –

+0

Existe-t-il une classe ou une documentation pour cela? –

Répondre

1

Essayez d'utiliser AsyncTask, dans la méthode doInBackground écrire quelque chose comme ça

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

Je l'ai commencé dans un fil, utilisé la fonction, tout semble parfait, mais il faut encore 4-5 secondes pour charger le fond d'écran. Y a-t-il une solution réelle pour cela? –

+0

Oui, c'est bon. Décoder une grande image est une opération difficile. Donc, cela dépend de la taille - la plus petite taille requise le plus rapide sera effectuée –