2011-01-22 1 views
3

Я пытаюсь использовать изображение с SD-карты и установить его как фон для релятивирования. Я пробовал другие решения, которые я нашел здесь и в других местах, но они, похоже, работали на меня. вот мой код. Я прокомментировал другие способы, которые я пробовал и не работал. единственное, что сработало для меня, это использовать setBackgroudnResource и использовать ресурс из приложения, но это было просто для проверки, чтобы mRoot был настроен правильно. когда я пробовал все другие способы, он ничего не устанавливает. Кто-нибудь знает, что я делаю неправильно, или если есть лучший способ сделать это?Создание извлекаемого с SD-карты для установки в качестве фона в android

 //one way i tired... 
//String extDir = Environment.getExternalStorageDirectory().toString(); 
//Drawable d = Drawable.createFromPath(extDir + "/pic.png"); 
//mRoot.setBackgroundDrawable(d); 

//another way tried.. 
//Drawable d = Drawable.createFromPath("/sdcard/pic.png"); 
//mRoot.setBackgroundDrawable(d); 

//last way i tried... 
mRoot.setBackgroundDrawable(Drawable.createFromPath(new File(Environment.getExternalStorageDirectory(), "pic.png").getAbsolutePath())); 

//worked, only to verify mRoot was setup correctly and it could be changed 
//mRoot.setBackgroundResource(R.drawable.bkg); 

ответ

10

Вы не загружаете извлекаемую карту SD, а растровое изображение. Вот способ загрузить его с уменьшенной выборкой (качество), чтобы программа не жаловалась, если изображение слишком велико. Тогда, я думаю, вам нужно обработать это растровое изображение, то есть обрезать его и изменить размер для фона.

  // Read bitmap from Uri 
    public Bitmap readBitmap(Uri selectedImage) { 
     Bitmap bm = null; 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 2; //reduce quality 
     AssetFileDescriptor fileDescriptor =null; 
     try { 
      fileDescriptor = this.getContentResolver().openAssetFileDescriptor(selectedImage,"r"); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     finally{ 
      try { 
       bm = BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options); 
       fileDescriptor.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return bm; 
    } 

Uri здесь может поставляться с помощью операции выбора галереи.

Изображение может быть сохранено в ресурсах приложения и загружаются в ImageView

 private void saveBackground(Bitmap Background) { 
     String strBackgroundFilename = "background_custom.jpg"; 
     try { 
      Background.compress(CompressFormat.JPEG, 80, openFileOutput(strBackgroundFilename, MODE_PRIVATE)); 
     } catch (Exception e) { 
      Log.e(DEBUG_TAG, "Background compression and save failed.", e); 
     } 

     Uri imageUriToSaveCameraImageTo = Uri.fromFile(new File(BackgroundSettings.this.getFilesDir(), strBackgroundFilename)); 

     // Load this image 
     Bitmap bitmapImage = BitmapFactory.decodeFile(imageUriToSaveCameraImageTo.getPath()); 
     Drawable bgrImage = new BitmapDrawable(bitmapImage); 

     //show it in a view 
     ImageView backgroundView = (ImageView) findViewById(R.id.BackgroundImageView); 
     backgroundView.setImageURI(null); 
     backgroundView.setImageDrawable(bgrImage); 
    } 
+0

спасибо за ответ. Я пробовал его ур и его все еще не работал. Я использую подборщик галереи и захват uri с изображения, затем я вызываю вашу функцию и пытаюсь установить возвращаемое растровое изображение на drawable, и оно не работает. когда я проверяю его с помощью getbounds, он возвращает 0 для левого, правого, верхнего и нижнего. любая идея о том, что я делаю неправильно? вот код, который я только что описал: Uri selectedImage = imageReturnedIntent.getData(); Bitmap testimage = readBitmap (selectedImage); \t \t BitmapDrawable bmd2 = new BitmapDrawable (Multimedia.this.getResources(), testimage); \t \t Rect t2 = bmd2.getBounds(); – John

+0

Тестирование находится в памяти и еще не сохранено в ресурсах приложения, что вам может понадобиться, чтобы сохранить его. Таким образом, чтобы получить drawable, это должно сделать: bmd2 = new BitmapDrawable (testimage); Сначала попробуйте небольшое изображение. Правильный способ состоит в том, чтобы передать это растровое изображение методу, который будет масштабировать его для фона и сохранить, прежде чем преобразовать его в drawable. На каждом этапе проверьте, что вы используете с помощью журналов или Toast. Попробуйте это после readBitmap int h = bitmap.GetHeight(); int w = bitmap.getWidth(); и покажите h и w, чтобы увидеть размер. Этот метод работает, я пробовал его на многих устройствах ... – Lumis

+0

ОК, поэтому я проверяю высоту и ширину растрового изображения, и я получаю значения. как я могу сохранить его в ресурсах приложений или сделать это с помощью bitmapdrawable, и для этого требуется больше времени для обработки? – John

0

Я предлагаю проверить правильность загрузки drawable. Некоторые вещи, чтобы попробовать:

  • Попробуйте использовать другое изображение на сд карте
  • Put pic.png в R.drawable и убедитесь, что mRoot.setBackgroundResource() делает то, что вы ожидаете
  • После загрузки вытяжки , проверьте d.getBounds(), чтобы убедиться, что это то, что вы ожидаете.
+0

Спасибо за ответ. Я попробовал, что сказал u, и изображение отлично работает, когда оно находится в приложении в качестве ресурса, но когда я пытаюсь получить его с моей SD-карты (с проверкой, которую вы предложили), я получаю исключение с нулевым указателем. Я предполагаю, что он не делает переносимый, но я не знаю, почему – John

+0

Очень плохо, что createFromPath() не бросает никаких исключений, если файл не найден или каким-то образом не поддается анализу. Я бы дважды уточнил, что в файле есть «adb shell ls -l /sdcard/pic.png». У кого-нибудь есть предложение? – levis501

+0

Ну, я сделал это с использованием растрового изображения, как я объяснил в комментарии к другому ответу, но его пока не работает, и я получаю все границы равными 0. Любые идеи? – John

5
File file = new File(url.getAbsolutePath(), imageUrl); 

       if (file.exists()) { 

        mDrawable = Drawable.createFromPath(file.getAbsolutePath()); 

       } 
+1

Это возвращает меньшее изображение, чем на диске. Любая идея почему? – Radu

Смежные вопросы