Выбор с намерением камеры и выбора изображения
Я создал селектор для выбора изображения из файла или для создания изображения.
Код, который я использую, отлично работает на Nexus 5, однако, когда я пробую его на Samsung S5, при выборе не отображаются значки камеры.
public Intent makePhotoIntent(String title, Context ctx, String uniqueImageId){
//Build galleryIntent
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
//Create chooser
Intent chooser = Intent.createChooser(galleryIntent,title);
if (checkexCameraHardware()){
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
mTempImage = null;
try {
mTempImage = createImageFile(uniqueImageId);
} catch (IOException e) {
e.printStackTrace();
}
if (mTempImage != null){
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempImage)); //add file ure (photo is saved here)
Intent[] extraIntents = {cameraIntent};
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
}
}
return chooser;
}
Когда я изменяю порядок, в котором намерения добавляются в селектор, устройство Samsung показывает камеру, но показывает только Android-систему в качестве опции файла.
public Intent makePhotoIntent(String title, Context ctx, String uniqueImageId){
//Build galleryIntent
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
//Create chooser
Intent chooser = Intent.createChooser(galleryIntent,title);
if (checkexCameraHardware()){
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
mTempImage = null;
try {
mTempImage = createImageFile(uniqueImageId);
} catch (IOException e) {
e.printStackTrace();
}
if (mTempImage != null){
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempImage)); //add file ure (photo is saved here)
//I have to re-create the chooser here or the Samsung will not show the 'camera' icons.
//I have to add the cameraIntent first.
chooser = Intent.createChooser(cameraIntent,title);
Intent[] extraIntents = {galleryIntent};
//Intent[] extraIntents = {cameraIntent};
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
}
}
return chooser;
}
В идеале я хотел бы, чтобы устройство Samsung показывало то же самое, что и устройство Nexus, когда я сначала добавляю намерение галереи. Однако я не могу заставить это работать.
3 ответа
Если есть несколько совпадений намерений для дополнительного намерения (
Intent.EXTRA_INITIAL_INTENTS
), он покажет все их вместе в "Android System". Когда вы нажмете "Система Android", он откроет другой селектор со всеми этими совпадениями намерений.Итак, на вашем первом скриншоте для устройства Samsung действительно отображается камера - она находится прямо под "Android Systeem" (при нажатии на нее отобразятся все совпадения намерений камеры).
Если вы делаете
galleryIntent
дополнительно вместо намерения камеры, он объединит все связанные с галереей намерения в "Системе Android" (как видно на втором снимке экрана для устройства Samsung)
Я думаю, что пользователь может быть сбит с толку, если он не знает, что это за "Android Systeem"!
С помощью приведенного ниже решения вы можете напрямую добавить каждого из них в свой
chooser
В вашем втором фрагменте кода замените
Intent[] extraIntents = {galleryIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
с:
List<Intent> galleryIntents = new ArrayList<Intent>(); PackageManager pm = getApplicationContext().getPackageManager(); for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent, PackageManager.MATCH_DEFAULT_ONLY)) { Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName); intent.setAction(Intent.ACTION_PICK); galleryIntents.add(intent); } chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, galleryIntents.toArray(new Parcelable[] {}));
Это вручную добавит каждое подходящее намерение непосредственно к вашему chooser
Попробуйте таким образом, надеюсь, это поможет вам решить вашу проблему
Пожалуйста, следуйте этим шагам, и это лучший и простой способ выбрать изображение из галереи и с камеры,
Шаг 1. объявить глобальные переменные
public static final int rcCC = 33;
boolean isCC = false;
Шаг 2 . Скопируйте эти методы и вставьте свой код
void picPhoto() {
String str[] = new String[] { "Camera", "Gallery" };
new AlertDialog.Builder(getActivity()).setItems(str,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
performImgPicAction(which);
}
}).show();
}
void performImgPicAction(int which) {
Intent in;
if (which == 1) {
in = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
} else {
in = new Intent();
in.setAction(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
startActivityForResult(
Intent.createChooser(in, "Select profile picture"), which);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (rcCC == requestCode) {
getActivity();
if (resultCode == Activity.RESULT_OK) {
isCC = true;
}
} else {
getActivity();
if (resultCode == Activity.RESULT_OK) {
BitmapFactory.Options option = new BitmapFactory.Options();
option.inDither = false;
option.inPurgeable = true;
option.inInputShareable = true;
option.inTempStorage = new byte[32 * 1024];
option.inPreferredConfig = Bitmap.Config.RGB_565;
if (Build.VERSION.SDK_INT < 19) {
Uri selectedImageURI = data.getData();
uImage = BitmapFactory.decodeFile(Common.getPath(
selectedImageURI, getActivity()), option);
} else {
ParcelFileDescriptor pfd;
try {
pfd = context
.getContentResolver()
.openFileDescriptor(data.getData(), "r");
FileDescriptor fileDescriptor = pfd
.getFileDescriptor();
uImage = BitmapFactory.decodeFileDescriptor(
fileDescriptor, null, option);
pfd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
ivProfile_image.setImageBitmap(uImage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Шаг 3. вызов метода, где вы хотите выбрать рис и показать диалог
picPhoto();
Шаг 4
Сделать разрешение пользователя в файле манифеста,
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
Спасибо
Попробуйте таким образом, я надеюсь, что это работает для вас, я проверяю в Samsung Galaxy Tab 2, он показывает опцию камеры
Объявите свое намерение вот так
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
//Create chooser
Intent chooser = Intent.createChooser(galleryIntent,title);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(uniqueImageId);
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, fileUri); //add file ure (photo is saved here)
Intent[] extraIntents = {cameraIntent};
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
startActivityForResult(chooser, Constants.SEND_IMAGE_FROM_CEMERA);
и getOutputMediaFileUri(uniqueImageId) метод, который возвращает вам Uri изображения
getOutputMediaFileUri(String uniqueImageId){
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"IMAGE_DIRECTORY_NAME");
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "IMG_" + uniqueImageId + ".jpg");
return Uri.fromFile(mediaFile);
}