我正在尝试创建一个可以检测用户何时拍照的应用.我设置了一个广播接收器类,并通过以下方式将其注册在清单文件中:
<receiver android:name="photoReceiver" >
<intent-filter>
<action android:name="com.android.camera.NEW_PICTURE"/>
<data android:mimeType="image/*"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
无论我尝试做什么,该程序都不会收到广播.这是我的接收器类:
public class photoReceiver extends BroadcastReceiver {
private static final String TAG = "photoReceiver";
@Override
public void onReceive(Context context, Intent intent) {
CharSequence text = "caught it";
int duration = Toast.LENGTH_LONG;
Log.d(TAG, "Received new photo");
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除清单和我的活动中的mimeType行,我会发送自己的广播
Intent intent = new Intent("com.android.camera.NEW_PICTURE");
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
然后我成功收到广播,可以看到日志和吐司窗口.我是以正确的方式接近这个吗?我需要添加什么东西吗?
android android-manifest android-camera android-camera-intent
我以前成功使用过此代码片段,但文件指向SD卡上的某个位置.
final File temp = new File(getCacheDir(), "temp.jpg");
temp.delete();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(temp));
startActivityForResult(intent, CONFIG.Intents.Actions.SELECT_CAMERA_PHOTO);
Run Code Online (Sandbox Code Playgroud)
但是,当我使用getCacheDir而不是SD卡上的loc时,似乎从未保存过照片.这是缓存目录和图像捕获的限制吗?
我想写一个活动:
是否有适用于每台设备的完整示例?链接到一个简单的开源应用程序拍照将是理想的答案.
我的研究到目前为止:
这是一个常见的场景,有很多问题和教程.
主要有两种方法:
方法1本来是完美的,但问题是每个设备上的意图实现不同. 在某些设备上它运作良好.但是,在某些设备上,您可以拍照,但它永远不会返回到您的应用.在某些设备上,启动意图时没有任何反应.通常它还将图像保存到SD卡,并且需要存在SD卡.每个设备上的用户交互也不同.
方法2的问题是稳定性.我尝试了一些例子,但我设法阻止相机在某些设备上工作(直到重启)并完全冻结另一台设备.在另一台设备上捕捉工作,但预览保持黑色.
我会使用ZXing作为示例应用程序(我经常使用它),但它只使用预览(取景器),并且不拍任何照片.我还发现,在某些设备上,ZXing在光照条件改变时没有自动调整白平衡,而原生相机应用程序正确地做到了(不确定是否可以修复).
更新:
有一段时间我直接使用了相机API.这提供了更多控制(自定义UI等),但我不建议任何人.我会在90%的设备上工作,但是每次都会发布一个新的设备,但是会遇到不同的问题.
我遇到的一些问题:
所以一般来说,除非没有别的办法,否则我不建议去这条路线.两年后,我通过自定义代码转储并切换回基于Intent的方法.从那时起,我的麻烦就少了很多.我过去在基于意图的方法中遇到的问题可能只是我自己的无能.
如果你真的需要走这条路,我听说如果你只支持Android 4.0+的设备会更容易.
我按照Android开发站点上的Camera上的说明进行操作
我只是启动Camera Intent,而不是自己制作相机.
拍照后处理结果返回的示例代码如下.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured …Run Code Online (Sandbox Code Playgroud) 我正在使用相机意图在我的应用程序中捕获图像.我的应用程序在Android 5.0.2使用相机时崩溃的问题.我正在使用片段的意图.下面是我片段内的代码:
拍照的方法
private void takePhoto() {
mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
Log.d(UploadPicturesFragment.class.getSimpleName(),
"URI: " + mHighQualityImageUri.toString());
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mHighQualityImageUri);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}
Run Code Online (Sandbox Code Playgroud)
我片段中的onActivityResult
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_IMAGE_CAPTURE) {
Log.d(UploadPicturesFragment.class.getSimpleName(),
"IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
mHighQualityImageUri);
DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
bitmap.getHeight());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Android相机,对于API 23或更高版本,它需要在运行时请求权限.根据文档,我可以使用ActivityCompat或ContextCompat来实现.我不明白这两者之间有什么区别和他们的权衡.
谢谢你的时间.
android android-camera android-camera-intent android-camera2
我想在ImageView中使用显示从相机拍摄的图像
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Run Code Online (Sandbox Code Playgroud)
到目前为止,此工作正常,但在用户使用所选的相机应用程序拍摄照片后,会出现一个对话框(可能来自应用程序),询问是否保存或删除拍摄的照片(至少在Android 2.3和4.2上使用默认的相机应用程序).
我想跳过这个额外的对话框,直接在ImageView中显示图像(当调用onActivityResult时),因为这意味着用户需要额外的交互步骤,这是不必要的,因为他可以保存或删除照片.我的应用.
这可以使用简单的ACTION_IMAGE_CAPTURE Intent,还是需要更复杂的东西,比如Camera Preview和SurfaceView?
我有一个意图选择器,允许我从画廊或相机中选择图像,如下所示:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null);
galleryIntent.setType("image/*");
galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);
chooser.putExtra(Intent.EXTRA_TITLE, "title");
Intent[] intentArray = {cameraIntent};
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooser,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
我希望我的onActivityResult方法是这样的:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(Condition == picture_coming_from_gallery)
{
//my code here
}
else if(condition == picture_coming_from_camera)
{
//another code here
}
}
Run Code Online (Sandbox Code Playgroud)
是什么条件让我知道我的图像来自哪个来源?
更新:
现在它正在运行,这是解决方案:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
{ …Run Code Online (Sandbox Code Playgroud) 我需要将使用我的应用程序拍摄的照片保存在特定文件夹中.我已经阅读了很多这个问题的解决方案,但我无法使它们中的任何一个工作,所以我寻求帮助.
MainActivity.java
public void onClick(View v) {
Intent camera = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
//Folder is already created
String dirName = Environment.getExternalStorageDirectory().getPath()
+ "/MyAppFolder/MyApp" + n + ".png";
Uri uriSavedImage = Uri.fromFile(new File(dirName));
camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
startActivityForResult(camera, 1);
n++;
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml中
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud) android android-sdcard android-gallery android-camera-intent
我用这段代码从相机中捕捉图像.
package android.takeowneship;
import java.io.File;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ImageView;
import android.widget.Toast;
public class camera extends Activity{
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
Uri imageUri;
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//define the file-name to save photo taken by Camera activity
String fileName = "new-photo-name.jpg";
//create parameters for Intent with filename
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture …Run Code Online (Sandbox Code Playgroud)