Изменить изображение в ImageButton
В активности для введения данных игрока я вставила ImageButton для аватара. Написала код для получения новой картинки с камеры или галереи и установки на место программной. Галерея и камера открываются, картинки я, вроде бы, сохраняю в виде файла, но в устройстве они не вставляются на место аватара. Остаётся тёмный прямоугольник вместо картинки и я не могу после этого вставлять данные пароля и т.п., т.е. активность перестаёт работать. В манифесте есть нужные разрешения и configChanges="orientation/screenSize". В основной активности я объявила строковое значение для аватара. Причём, я достала весь код, который касается ImageButton, из данного кода и вставила в отдельную программу и всё прекрасно работает, картинки вставляются. Может быть, когда ImageButton в сложной активности, нужно было сделать что-то ещё? Помогите, пожалуйста. Я пыталась вставить сюда свой код, но не получилось почему-то. Мой код частично:
public class QuizSettingsActivity extends QuizActivity {
//Oбъявить уникальные идентификаторы
//Для диалогов
static final int DATE_DIALOG_ID = 0;
static final int PASSWORD_DIALOG_ID = 1;
//два кода запроса для изображений на аватаре.
static final int TAKE_AVATAR_CAMERA_REQUEST = 1;.
static final int TAKE_AVATAR_GALLERY_REQUEST = 2;.
protected static final String DEBUG_TAG = null;.
TextView tvDate;.
ImageButton avatarButton;
//объявить переменную-член, представляющую экземпляр
//класса SharedPreferences.
SharedPreferences mGameSettings;.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
tvDate=(TextView) findViewById(R.id.TVDR);
//Адрес для обращения к картинке для аватара
Uri path = Uri.parse(
"android.resource://az.triviaquiz/drawable/avatar");
//Инициализируем ImageButton для аватара
avatarButton=(ImageButton)findViewById(R.id.bAvatar);
//Вставляем картинку в аватар
avatarButton.setImageURI(path);
//Создаём слушатель нажатия
avatarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: Launch the Camera and Save the Photo as the Avatar
//Запуск интента ACTION_IMAGE_CAPTURE для добавления
//в приложение возможности съёмки фотографий и возвращения снимка
Intent pictureIntent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(pictureIntent,
TAKE_AVATAR_CAMERA_REQUEST);
}
});
//Создаём слушатель для длительного нажатия
avatarButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO: Launch Image Picker and Save Image as Avatar
//Cоздаём интент для отображения пользователю всех изображений из галереи,
//позволяя выбрать одно из них
Intent pickPhoto = new Intent(Intent.ACTION_PICK);
pickPhoto.setType("image/*");
startActivityForResult(pickPhoto, TAKE_AVATAR_GALLERY_REQUEST);
return false;
}
});.
...
//Для обработки результатов,возвращаемых деятельностью,
//необходимо реализовать метод onActivityResult().
protected void onActivityResult(int requestCode,int resultCode,Intent data) {.
switch(requestCode) {.
//Изготовление фотографии с помощью камеры.
case TAKE_AVATAR_CAMERA_REQUEST:.
if (resultCode == Activity.RESULT_CANCELED) {.
//Режим камеры был отменён???
} else if (resultCode == Activity.RESULT_OK) {.
//Обработка выбранного изображения.
//Получаем растровое изображение, обратившись.
//к параметру типа intent с именем data.
Bitmap cameraPic = (Bitmap) data.getExtras().get("data");.
//передать полученное растровое.
//изображение во вспомогательный метод saveAvatar().
saveAvatar(cameraPic);.
}.
break;.
//Выбор фотографии в галерее.
case TAKE_AVATAR_GALLERY_REQUEST:.
if (resultCode == Activity.RESULT_CANCELED) {.
// Выбор аватара в галерее был отменён.
} else if (resultCode == Activity.RESULT_OK) {.
// Обработка выбранного изображения.
// Получаем адрес URI для выбранного изображения,.
//обратившись к параметру типа Intent с именем data, как показано в следующем коде:.
Uri photoUri = data.getData();.
//Чтобы преобразовать адрес типа Url в соответствующий
//экземпляр класса Bitmap, вы можете использовать, следующий метод:.
Bitmap galleryPic = null;.
try {.
galleryPic = Media.getBitmap(getContentResolver(), photoUri);.
} catch (FileNotFoundException e) {.
// TODO Auto-generated catch block.
e.printStackTrace();.
} catch (IOException e) {.
// TODO Auto-generated catch block.
e.printStackTrace();.
}.
//передать полученное растровое.
//изображение в ваш вспомогательный метод saveAvatar().
saveAvatar(galleryPic);
}
break;.
}
}
//Вспомогательный метод с именем saveAvatar(). Этот метод
//будет принимать растровое изображение и
//сохранять его в виде локального файла.
private void saveAvatar(Bitmap avatar) {.
// TODO:Save the Bitmap as a local file called avatar.jpg.
//чтобы сохранить аватар в виде JPG-файла,
//принадлежащего данному приложению, можно использовать
//следующий код:.
String strAvatarFilename = "avatar.jpg";.
//Сжимаем изображение в нужный формат.
try {.
avatar.compress(CompressFormat.JPEG,
100, openFileOutput(strAvatarFilename, MODE_PRIVATE));.
} catch (FileNotFoundException e) {.
// TODO Auto-generated catch block.
e.printStackTrace();.
System.out.print("У нас проблема");.
}.
// TODO:Determine the Uri to the local avatar.jpg file.
//определить адрес URI файла, используя метод fromFile() класса Uri.
Uri imageUri = Uri.fromFile(new File(getFilesDir(),
strAvatarFilename));.
//Преобразуем путь в строку.
String strPath=imageUri.toString();
//Обновить содержимое элемента ImageButton
avatarButton.setImageURI(Uri.parse(strPath));
}