如何使用一个意图访问android中的照片和相机

如何使用一个意图访问android中的照片和相机,android,android-camera,android-gallery,android-camera-intent,Android,Android Camera,Android Gallery,Android Camera Intent,如果您使用whatsapp并单击“附加”按钮,将弹出一个菜单/弹出窗口,向您显示一个应用程序列表,您可以使用该应用程序选择图像,甚至使用照片应用程序从相机拍照 我正在制作一个应用程序,它的功能与whatapp的访问和拍照功能几乎相同。问题是,我不能使用弹出对话框中列出的照片应用程序拍照,但我可以在使用whatsapp时拍照。当我从应用程序中显示的对话框中单击照片应用程序时,它会显示我的所有照片。但当我点击whatsapp弹出窗口中的照片应用程序时,它会直接进入相机 在我的android清单中 我

如果您使用whatsapp并单击“附加”按钮,将弹出一个菜单/弹出窗口,向您显示一个应用程序列表,您可以使用该应用程序选择图像,甚至使用照片应用程序从相机拍照

我正在制作一个应用程序,它的功能与whatapp的访问和拍照功能几乎相同。问题是,我不能使用弹出对话框中列出的照片应用程序拍照,但我可以在使用whatsapp时拍照。当我从应用程序中显示的对话框中单击照片应用程序时,它会显示我的所有照片。但当我点击whatsapp弹出窗口中的照片应用程序时,它会直接进入相机

在我的android清单中


我需要在代码中更改什么才能从照片应用程序拍照?

因此,要将它们启动到本机相机应用程序或用户选择为默认的相机应用程序,我相信您会使用此选项

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = Intent.createChooser(intent, title);
// Always use string resources for UI text.
// This says something like "Take a photo with"
String title = getResources().getString(R.string.chooser_title)

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}

编辑了它,并提供了这样做所需的示例。它可能不是简单的剪切和粘贴,但你应该能够从中找出它。抱歉,时间太短,所以我现在无法详细说明。

您可以从以下代码中拍摄照片

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}
并获取捕获照片的缩略图

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        mImageView.setImageBitmap(imageBitmap);
    }
}
由于需要保存捕获的图像,因此需要指定权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
你可以这样调用意图

静态最终int请求\u拍摄\u照片=1

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            ...
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}
如果您将照片保存到 getExternalFilesDir,媒体扫描程序无法访问这些文件 因为它们对你的应用程序是私有的

下面的代码将调用系统的媒体扫描仪,将您的照片添加到媒体提供商数据库中。使其在Android Gallery和其他Gallery应用程序中可用

private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}
资源是,


尝试添加android.permission.WRITE\u外部存储 到你的舱单

摄像机:

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, 0);//zero can be replaced with any action code
画廊:

Intent pickPhoto = new Intent(Intent.ACTION_PICK,
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto , 1);//one can be replaced with any action code
onactivity结果代码:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) {
    case 1:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }
    break;
    case 0:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }
    break; 
    }

}下面的代码将在本机对话框中显示摄像头和浏览存储选项

 // Picks Camera first.
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
        captureIntent, 0);
for (ResolveInfo res : listCam) {
  final String packageName = res.activityInfo.packageName;
  final Intent intent = new Intent(captureIntent);
  intent.setComponent(new ComponentName(res.activityInfo.packageName,
          res.activityInfo.name));
  intent.setPackage(packageName);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  cameraIntents.add(intent);
}

final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_PICK);

// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent,
        "Select Image from");

// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
        cameraIntents.toArray(new Parcelable[]{}));

startActivityForResult(chooserIntent, TAKE_PHOTO_CODE);
这将对你有所帮助

并在自定义对话框中显示与whatsapp相同的内容,请参阅下面的链接 ..

使用一个意图访问相机和照片

使用应用程序的意图填充自定义对话框的listview,这些应用程序既可以使用照相机拍照,也可以像这样访问存储中的照片

Poputate对话框的listview lv,其中包含可执行这两个操作的应用程序

public void populateDialogListView(){

  PackageManager pm=getPackageManager();

 List<ResolveInfo> photoIntents = new ArrayList<>();

final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
        captureIntent, PackageManager.GET_RESOLVED_FILTER);

final List<ResolveInfo> listGalley = packageManager.queryIntentActivities(photoPickerIntent, PackageManager.GET_RESOLVED_FILTER);

for (ResolveInfo activity : listCam) {
  photoIntents.add(activity);
}

for (ResolveInfo activity : listGalley) {
  photoIntents.add(activity);
}



Collections.sort(photoIntents,
        new ResolveInfo.DisplayNameComparator(pm));

AppAdapter appAdapter = new AppAdapter(pm, photoIntents);

lv.setAdapter(appAdapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                            long arg3) {
        // TODO Auto-generated method stub
        ResolveInfo launchable=appAdapter.getItem(position);
        ActivityInfo activity=launchable.activityInfo;
        ComponentName name=new ComponentName(activity.applicationInfo.packageName,
                activity.name);

       IntentFilter filter = launchable.filter;

        int actioncode;
        Intent  intent = new Intent();
        Uri uri;
        if(filter.hasAction(Intent.ACTION_PICK)){
            actioncode = 1;
            uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            intent.setData(uri);
        }else{
            actioncode = 0;
        }
        intent.setComponent(name);
        startActivityForResult(intent,actioncode);
    }
});

}

任何问题,请告诉我

我想展示你可以用来选择和拍照的应用程序,就像whatsapp在弹出窗口中显示厨房和照片应用程序一样。whatsapp中,你可以在拍照时转到你的照片吗?@tinysunlight in Whatap你可以使用照片应用程序拍照或使用厨房应用程序选择照片。对于我的情况,我无法使用弹出窗口中显示的照片应用程序拍照。我不知道我需要在我的意图中添加什么,我认为你应该自己定制。您可以比较弹出窗口和您的弹出窗口,看看它们是否具有相同的样式。@tinysunlight嗯,您是对的。问题是,如何使用可用于拍照或访问照片的应用程序填充自定义对话框,并在对话框中的该应用程序上实现onclick侦听器?创建一个带有2个按钮的对话框。添加“绑定一个”按钮以像回答一样拍照,并像你一样绑定另一个按钮以打开图库。我想实现你的回答,我想我必须创建自己的弹出窗口,其中包含所有可以拍摄或访问应用的应用。问题是,如何使用此应用填充对话框并实现onclick侦听器?当您启动相机/多媒体资料时,您的设备会自动向您提供可使用的应用列表。我认为可能有两个原因:-你的设备有一个应用程序可以处理意图。-您有一个默认的应用程序来处理这种意图捕获/图库。
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) {
    case 1:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }
    break;
    case 0:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }
    break; 
    }
 // Picks Camera first.
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
        captureIntent, 0);
for (ResolveInfo res : listCam) {
  final String packageName = res.activityInfo.packageName;
  final Intent intent = new Intent(captureIntent);
  intent.setComponent(new ComponentName(res.activityInfo.packageName,
          res.activityInfo.name));
  intent.setPackage(packageName);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  cameraIntents.add(intent);
}

final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_PICK);

// Chooser of filesystem options.
final Intent chooserIntent = Intent.createChooser(galleryIntent,
        "Select Image from");

// Add the camera options.
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
        cameraIntents.toArray(new Parcelable[]{}));

startActivityForResult(chooserIntent, TAKE_PHOTO_CODE);
private void acquirePicture(){
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");

Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams WMLP = dialog.getWindow().getAttributes();
WMLP.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(WMLP);
dialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setCanceledOnTouchOutside(true);
dialog.setContentView(R.layout.about_dialog);
dialog.setCancelable(true);
lv=(ListView)dialog.findViewById(R.id.listView1);

populateDialogsListView();

dialog.show();
}
public void populateDialogListView(){

  PackageManager pm=getPackageManager();

 List<ResolveInfo> photoIntents = new ArrayList<>();

final List<ResolveInfo> listCam = packageManager.queryIntentActivities(
        captureIntent, PackageManager.GET_RESOLVED_FILTER);

final List<ResolveInfo> listGalley = packageManager.queryIntentActivities(photoPickerIntent, PackageManager.GET_RESOLVED_FILTER);

for (ResolveInfo activity : listCam) {
  photoIntents.add(activity);
}

for (ResolveInfo activity : listGalley) {
  photoIntents.add(activity);
}



Collections.sort(photoIntents,
        new ResolveInfo.DisplayNameComparator(pm));

AppAdapter appAdapter = new AppAdapter(pm, photoIntents);

lv.setAdapter(appAdapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                            long arg3) {
        // TODO Auto-generated method stub
        ResolveInfo launchable=appAdapter.getItem(position);
        ActivityInfo activity=launchable.activityInfo;
        ComponentName name=new ComponentName(activity.applicationInfo.packageName,
                activity.name);

       IntentFilter filter = launchable.filter;

        int actioncode;
        Intent  intent = new Intent();
        Uri uri;
        if(filter.hasAction(Intent.ACTION_PICK)){
            actioncode = 1;
            uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            intent.setData(uri);
        }else{
            actioncode = 0;
        }
        intent.setComponent(name);
        startActivityForResult(intent,actioncode);
    }
});

}
class AppAdapter extends ArrayAdapter<ResolveInfo> {
     private PackageManager pm=null;

  AppAdapter(PackageManager pm, List<ResolveInfo> apps) {
    super(Custom_chooser.this, R.layout.row, apps);
    this.pm=pm;
  }

@Override
public View getView(int position, View convertView,
                    ViewGroup parent) {
    if (convertView==null) {
        convertView=newView(parent);
    }

    bindView(position, convertView);

    return(convertView);
}

private View newView(ViewGroup parent) {
    return(getLayoutInflater().inflate(R.layout.row, parent, false));
}

private void bindView(int position, View row) {
    TextView label=(TextView)row.findViewById(R.id.label);

    label.setText(getItem(position).loadLabel(pm));

    ImageView icon=(ImageView)row.findViewById(R.id.icon);

    icon.setImageDrawable(getItem(position).loadIcon(pm));
}