在我的应用程序中,我通过Android摄像头捕获照片,然后我想将其发送到服务器.为此我使用Client Socket编程.我将捕获照片转换为bytearray(byte []),然后将其发送到服务器.每件事都在事实上发挥作用.
问题在那里我无法将原始照片发送到服务器.缩略图照片由Android手机发送.但是当我通过相机捕捉照片时,原始照片就在画廊中.
如何在我的应用程序中使用此原始照片?
我的代码:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG);
cameraIntent.putExtra("return-data", true);
startActivityForResult(Intent.createChooser(cameraIntent, "Select Picture"),
CAMERA_REQUEST);
Run Code Online (Sandbox Code Playgroud)
在onActivityResult方法中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
// byte[] a = (byte[]) data.getExtras().getByteArray("data"); // I also use this but not work
ByteArrayOutputStream bos = new ByteArrayOutputStream();
photo.compress(CompressFormat.JPEG, 100, bos);
byte[] bitmapdata = bos.toByteArray();
}
}
Run Code Online (Sandbox Code Playgroud)
在bitmapdata照片是有,但压缩的照片不是原始的.有人说,改变压缩质量领域(CompressFormat.JPEG,100,bos); 在0到100之间,但什么都不会发生.
- >>还有其他方法可以获得相机拍摄的原始照片 …
我使用以下代码启动相机,但是,3/4的时间,照片无法保存到内存中.这只发生在Galaxy SIII上.它适用于Nexus S和Nexus One
public void photoNew() {
holdingImage = getContentResolver().insert(MUtil.genImgUri(), new ContentValues());
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Bundle extras = new Bundle();
extras.putParcelable(MediaStore.EXTRA_OUTPUT, holdingImage);
extras.putBoolean("return-data", true);
i.putExtras(extras);
startActivityForResult(i, REQ_PHOTO);
}
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我使用相机意图捕获的图像被旋转,我问为什么使用相机意图捕获的图像在Android上的某些设备上旋转?
所以根据那里的建议答案,我现在正在尝试旋转使用相机获得的图像(我已经使用了相机意图).我的代码是,
public class SimpleCameraActivity extends Activity {
private static final int TAKE_PICTURE = 1888;
private Uri imageUri;
ImageView imageView;
Bitmap bitmap;
Button btnOK, btnDiscard;
RelativeLayout rLButtons;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_camera);
imageView = (ImageView) findViewById(R.id.image_view_sc);
captureImage();
}
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, …Run Code Online (Sandbox Code Playgroud) 想要拍摄照片,裁剪并将图像保存在Android应用程序中时,我在Java中使用以下意图...
Intent camera=new Intent();
camera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
camera.putExtra("crop", "true");
camera.putExtra("outputX",600);
camera.putExtra("outputY", 600);
camera.putExtra("aspectX", 1);
camera.putExtra("aspectY", 1);
camera.putExtra("scale", true);
camera.putExtra("return-data", false);
Run Code Online (Sandbox Code Playgroud)
上述意图效果很好,但我的Y和X总是相等的.我打算分解代码,找出指定的内容,这样我就可以为我拍摄的图像制作可定制的 - 最重要的是独立的 - X和Y值...
android crop android-camera android-camera-intent resize-crop
请注意,startActivityForResult()方法受调用resolveActivity()的条件的保护,该条件返回可以处理intent的第一个活动组件.执行此检查很重要,因为如果使用无应用程序无法处理的意图调用startActivityForResult(),您的应用程序将崩溃.因此,只要结果不为null,就可以安全地使用intent.
码:
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但不适用于运行4.2.2的Alcatel设备.我收到了ELSE祝词"不能用相机......"
如果设备有相机,这怎么可能?
我现在应该怎么做?如何处理这个用例 - 显然我不得不依赖一些带摄像头的设备会报告"无法使用摄像头",检测到那些设备有摄像头然后使用它?!
文档或SO问题对ELSE案例一无所知.
阅读我的全部代码。除了Marshmallow和之外,它在每部手机上都能完美运行Lollipop。In Marshmallowand Lollipopphone Only 问题是只有在Picture Captured 的情况下才会data.getData()返回。如果我捕获视频,它工作正常。我有 4 个案例 -null
从图库中选择图片并在Imageview- 工作正常中显示其缩略图。
从相机捕获图片并在中显示其缩略图Imageview-在和 中不起作用。MarshmallowLollipop
从图库中选择视频并在Imageview- 工作正常中显示其缩略图。
3.Capturing Video from Camera 并在Imageview- Working Fine 中显示其缩略图。
现在有很多解决方案,但它们看起来都不令人满意,如果代码在视频捕获的情况下工作正常,那么为什么它不适用于图像捕获?这是错误还是我在某处做错了?
这是我的代码。我评论了发生崩溃的一行-
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
int THUMBSIZE = 120;
switch (requestCode){
case RESULT_LOAD_IMAGE:
if (resultCode==RESULT_OK){
String column_Name= MediaStore.Images.Media.DATA;
String picturePath=getPath(column_Name,data.getData());
Bitmap …Run Code Online (Sandbox Code Playgroud) 我知道有很多这方面的例子,但我还没有找到一个适用于7.0+的可靠例子.我知道我正在设置图像的缩略图而不是原始图像,但我不知道如何获得它.
这是我的代码:
if( ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{android.Manifest.permission.CAMERA},
CAMERA_REQUEST_CODE);
}
}else{
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST_CODE&& resultCode == RESULT_OK && data != null ) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
mImageView.setImageBitmap(bitmap);
}}
Run Code Online (Sandbox Code Playgroud) 我在从 uri 检索位图时遇到困难。我试图通过意图打开相机后获取从相机拍摄的图像。
try {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
imageUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName(), createImageFile());
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // set the image file name
}
startActivityForResult(intent, PERMISSION_REQUEST_CODE_CAMERA);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
登录时的 imageUri 是
内容://com.example/external_files/Pictures/CustomFolder/15122017_photo_115344.jpg
打开相机并拍照后,调用我的 onActivityResult 。因为我使用 MediaStore.EXTRA_OUTPUT,所以我的数据对象中没有收到任何内容,它为空。我尝试使用 MediaStore.Images.Media.getBitmap() 来检索位图。我传入 imageUri。我相信这可能不正确,因为我收到了异常。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PERMISSION_REQUEST_CODE_CAMERA) {
if (resultCode == Activity.RESULT_OK) {
Bitmap bitmap;
try {
bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), …Run Code Online (Sandbox Code Playgroud) 这个问题是针对熟悉Activity Lifecycle 的Android 开发人员的。
我正在开发一个执行面部检测和面部标志识别的应用程序。
相应的机器学习模型需要很长时间才能从 SD 存储中解析并加载到内存中。在当前的平均 Android 设备上,很容易需要长达 20 秒的时间。顺便说一句,所有这些面部分析内容和模型加载都发生在 C++ 本机代码中,并使用 Android NDK + JNI 进行集成。
由于模型加载需要很长时间,因此实际的解析和加载是通过 AsyncTasks 提前安排在后台的,因此用户不会注意到巨大的延迟。
在执行实际的人脸分析之前,用户可以通过 MediaStore.ACTION_IMAGE_CAPTURE 进行自拍。这将调用设备上安装的单独相机应用程序并通过 onActivityResult 接收图片。
现在问题开始了:当用户位于单独的相机活动/应用程序中时,几乎总是整个应用程序进程都会被终止。大多数情况下,它似乎发生在从相机应用程序返回之前(时间似乎很奇怪)。我做了另一个测试,以确认在相机应用程序内按下拍摄按钮时会发生这种情况。在那一刻,我的应用程序被杀死了。当按下“接受图像”按钮时,将重新创建应用程序。ActivityManager 在 logcat 中给出的进程终止原因是“prev LAST”(我通过 Google 没有找到任何关于此含义的信息,但我看到许多其他应用程序也因这个原因被终止,所以它似乎发生了经常)。
因此,我的应用程序的所有 Activity 都需要由 Android 重新创建(对我来说很好,因为它发生得很快),而且面部分析模型也必须从头开始重新加载,用户会注意到在自拍之前有巨大的延迟可以进行处理。
我的问题是:是否有可能告诉Android,活动/应用程序有合法的理由在暂时处于后台获取相机图片时不被杀死?毕竟,ActivityManager 做出了终止应用程序的错误决定。如此频繁地重新加载模型会占用大量的 CPU 和内存资源。
这似乎是 Android 生命周期架构中的一个疏忽。我知道很少有应用程序有我的应用程序的特定要求,但它仍然看起来很愚蠢。我能想到的“解决”这个问题的唯一方法是在应用程序中实现我自己的相机 Activity,但这违背了 Android 自己的最佳实践。
还有一些“android:persistent”标志,您可以通过 AndroidManifest.xml 坚持您的 Activity,但文档完全不清楚其含义。请参阅有关此的文档。
顺便说一句:当应用程序进程被杀死时,onDestroy 不会被调用。我在某处读到不能保证 onDestroy 会被调用,这对我来说实际上不是问题。虽然我想知道为什么 Android 文档没有明确说明这一点。
android android-ndk application-lifecycle activity-lifecycle android-camera-intent
我正在尝试实现一个应用程序,当启动时,我的自定义视频录制屏幕自动启动视频录制,我自己的按钮停止录制和其他按钮.我所做的是设计按钮的布局,直到现在,但如何在后台添加视频录制屏幕..请帮助.
android ×10
android-ndk ×1
bitmap ×1
camera ×1
crop ×1
image ×1
mediastore ×1
photo ×1
resize-crop ×1
rotation ×1