2014-01-27 4 views
0

Я сделал приложение для набора обоев, на моем устройстве (Nexus 5) он отлично работает, но на Galaxy TAB, Fame или даже на Optimus он дает ошибку java.lang.OutOfMemory. кто-то сказал мне, чтобы осуществить общественного Bitmap decodeAndResizeFile (Файл F), но я получаюОпределить файл-конструктор (Uri)?

вот мой MainActivity код пакет app.technozed.cablewallpapershd;

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.WallpaperManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener { 

ImageView display; 
int toPhone; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    System.gc(); 
    toPhone = R.drawable.wal1; 
    display = (ImageView) findViewById(R.id.WPdisplay); 
    ImageView image1 = (ImageView) findViewById(R.id.WPimg1); 
    ImageView image2 = (ImageView) findViewById(R.id.WPimg2); 
    ImageView image3 = (ImageView) findViewById(R.id.WPimg3); 
    ImageView image4 = (ImageView) findViewById(R.id.WPimg4); 
    ImageView image5 = (ImageView) findViewById(R.id.WPimg5); 
    ImageView image6 = (ImageView) findViewById(R.id.WPimg6); 
    ImageView image7 = (ImageView) findViewById(R.id.WPimg7); 
    ImageView image8 = (ImageView) findViewById(R.id.WPimg8); 
    ImageView image9 = (ImageView) findViewById(R.id.WPimg9); 
    ImageView image10 = (ImageView) findViewById(R.id.WPimg10); 
    Button setWall = (Button) findViewById(R.id.BsetWall); 
    image1.setOnClickListener(this); 
    image2.setOnClickListener(this); 
    image3.setOnClickListener(this); 
    image4.setOnClickListener(this); 
    image5.setOnClickListener(this); 
    image6.setOnClickListener(this); 
    image7.setOnClickListener(this); 
    image8.setOnClickListener(this); 
    image9.setOnClickListener(this); 
    image10.setOnClickListener(this);  setWall.setOnClickListener(this); 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

здесь я реализовал его:

общественного Bitmap decodeAndResizeFile (Файл F) {

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_SIZE = 70; 

     // Find the correct scale value. It should be the power of 2. 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE 
        || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
    } 
    return null; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
    case R.id.WPimg1: 
     display.setImageResource(R.drawable.wal1); 
     toPhone = R.drawable.wal1; 

здесь я retrive его: файл

File = новый файл (Uri. синтаксический анализ (String.valueOf (TOPHONE)));

на линии выше я получаю Конструктор File (Uri) не определено ошибка

Bitmap bmpp = decodeAndResizeFile(file); 
display.setImageBitmap(bmpp); 

     break; 
    case R.id.WPimg2: 
     display.setImageResource(R.drawable.wal2); 
     toPhone = R.drawable.wal2; 
     break; 
    case R.id.WPimg3: 
     display.setImageResource(R.drawable.wal3); 
     toPhone = R.drawable.wal3; 
     break; 
    case R.id.WPimg4: 
     display.setImageResource(R.drawable.wal4); 
     toPhone = R.drawable.wal4; 
     break; 
    case R.id.WPimg5: 
     display.setImageResource(R.drawable.wal5); 
     toPhone = R.drawable.wal5; 
     break; 
    case R.id.WPimg6: 
     display.setImageResource(R.drawable.wal6); 
     toPhone = R.drawable.wal6; 
     break; 
    case R.id.WPimg7: 
     display.setImageResource(R.drawable.wal7); 
     toPhone = R.drawable.wal7; 
     break; 
    case R.id.WPimg8: 
     display.setImageResource(R.drawable.wal8); 
     toPhone = R.drawable.wal8; 
     break; 
    case R.id.WPimg9: 
     display.setImageResource(R.drawable.wal9); 
     toPhone = R.drawable.wal9; 
     break; 
    case R.id.WPimg10: 
     display.setImageResource(R.drawable.wal10); 
     toPhone = R.drawable.wal10; 
     break; 
    case R.id.BsetWall: 
     try{ 
       WallpaperManager.getInstance(getApplicationContext()).setResource(toPhone); 
      Toast.makeText(getApplicationContext(), "Wallpaper was set!", Toast.LENGTH_SHORT).show(); 
     } catch(IOException e) { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), "No privileges!", Toast.LENGTH_SHORT).show(); 
     } 
     break; 
    } 
    } 
    } 

, как я могу определить? что я делаю неправильно?

ответ

0

Класс файла принимает java.net.URI в своем конструкторе, вы пытаетесь дать ему android.net.Uri.

Вот что не так, насколько я могу судить.

класс Файл вы используете: http://docs.oracle.com/javase/7/docs/api/java/io/File.html

принимает этот класс URI: http://docs.oracle.com/javase/7/docs/api/java/net/URI.html

можно передать так: http://developer.android.com/reference/java/net/URI.html

+0

Я определил Uri следующим образом: ** Uri selectedImage = data.getData(); String [] filePathColumn = {MediaStore.Images.Media.DATA}; Курсор курсор = getContentResolver(). Query (selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex (filePathColumn [0]); String picturePath = cursor.getString (columnIndex); файл File = новый файл (picturePath); // Bitmap БМПК = decodeAndResizeFile (файл); ** но 'data.getData()' не хочет работать, говоря: данные не могут быть решены –

0

я столкнулся эту ошибку так много раз ... Наконец, я вышел с одним распространенным методом для установки изображения ... Ниже приводится фрагмент кода ...

public static void setImageView(ImageView imageView, String path) { 
     Log.i("Atul Dravid", path); 
     if (path.startsWith("Photo") || path.startsWith("null")) 
      return; 
     path = path.startsWith("/") ? path : path.substring(6); 
     Bitmap picture = (Bitmap) BitmapFactory.decodeFile(path); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     picture = Bitmap.createScaledBitmap(picture, 200, 200, false); 
     picture.compress(Bitmap.CompressFormat.JPEG, 20, stream); 
     byte[] bitmapArray = stream.toByteArray(); 
     picture = (Bitmap) BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length); 
     //imageView.setImageURI(fileUri); 
     imageView.setImageBitmap(picture); 
     imageView.setContentDescription(path); 


    } 

Возможно, вы захотите изменить вышеуказанный код для вашего требования к разрешению изображения.

Надеюсь, это поможет.

EDIT

Технически Единственное отличие состоит в том, что я также добавил Scaling в моем коде ... Попробуйте представляя, что в вашем фрагменте кода ... Я не нашел какого-либо заметного ухудшения качества изображения ..

+0

и как можно я называю это в моих случаях? \t 'case R.id.WPimg4: \t display.setImageResource (R.drawable.wal4); \t \t toPhone = R.drawable.wal4; \t \t break; ' –

+0

Я хочу его масштабировать, но он должен соответствовать экрану моего телефона, как я могу это сделать? –

0

Ошибка компиляции из-за отсутствия конструктора для класса «Файл», который принимает объект Uri в качестве параметра.Для того, чтобы построить объект File, используя Uri, вы, как правило, называют GetPath() на URI, чтобы вернуть свой путь в виде строки:

File file=new File(Uri.parse(String.valueOf(toPhone)).getPath()); 

Однако это все равно не решить вашу проблему, потому что «TOPHONE» является целым числом представляющий идентификатор ресурса в вашем проекте (в этом случае можно сделать вывод). Таким образом вы не можете создать URI или путь к файлу из идентификатора ресурса. Однако в этом случае вы можете работать с идентификатором ресурса, а не с файлом.

Измените метод декодирования, чтобы принять идентификатор ресурса (то есть целое число):

public Bitmap decodeAndResizeFile(int resID) { 

... и использовать метод decodeResource из BitmapFactory вместо decodeStream (используя контекст на данный вид деятельности):

Bitmap bmp= BitmapFactory.decodeResource(context.getResources(), resID, o); 

Тогда вы можете назвать его:

Bitmap bmpp = decodeAndResizeFile(toPhone); 

Самым простым способом, чтобы получить т он контекст, чтобы объявить его в качестве переменной в классе активность:

private Context context; 

... и установить его в OnCreate():

context = this; 

Вы можете использовать его везде, где вам нужно, чтобы в вашем Мероприятия.

+0

контекст не может быть разрешен –

+0

Должен ли я определить его: 'Контекстный контекст; public myClass (контекст контекста) { this.context = context; } ' –

+0

См. Мое редактирование выше. Самый простой способ - сохранить ссылку на контекст вашей деятельности в onCreate. – NigelK

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