- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始在 Android 11 上使用字符串“com.android.camera.action.CROP”进行裁剪的隐式 Intent 。首次安装应用程序时无法通过此代码解析其 Activity 。
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
//to check whether there is an cropping app present or not
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(
intent, MATCH_DEFAULT_ONLY);
它不是第一次解析,第二次运行它得到了可以处理 Intent 的 Activity 。
最佳答案
此代码是从相机应用程序或图库应用程序捕获或导入图像并进行裁剪的代码。
主 Activity .java
public class MainActivity extends AppCompatActivity {
public final String APP_TAG = "crop";
public String intermediateName = "1.jpg";
public String resultName = "2.jpg";
Uri intermediateProvider;
Uri resultProvider;
ActivityResultLauncher<Intent> cameraActivityResultLauncher;
ActivityResultLauncher<Intent> galleryActivityResultLauncher;
ActivityResultLauncher<Intent> cropActivityResultLauncher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonCamera = findViewById(R.id.buttonCamera);
buttonCamera.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onLaunchCamera();
}
});
Button buttonGallery = findViewById(R.id.buttonGallery);
buttonGallery.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onPickPhoto();
}
});
cameraActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Bitmap takenImage = loadFromUri(intermediateProvider);
ImageView ivPreview = findViewById(R.id.originView);
ivPreview.setImageBitmap(getResizedBitmap(takenImage, 400));
onCropImage();
}
});
galleryActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
saveBitmapFileToIntermediate(result.getData().getData());
Bitmap selectedImage = loadFromUri(intermediateProvider);
ImageView ivPreview = findViewById(R.id.originView);
ivPreview.setImageBitmap(getResizedBitmap(selectedImage, 400));
onCropImage();
}
});
cropActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Bitmap cropImage = loadFromUri(resultProvider);
ImageView ivPreview = findViewById(R.id.resultView);
ivPreview.setImageBitmap(getResizedBitmap(cropImage, 400));
}
});
}
public void onLaunchCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = getPhotoFileUri(intermediateName);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
intermediateProvider = FileProvider.getUriForFile(MainActivity.this, "com.photostream.crop.fileprovider", photoFile);
else
intermediateProvider = Uri.fromFile(photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, intermediateProvider);
if (intent.resolveActivity(getPackageManager()) != null) {
cameraActivityResultLauncher.launch(intent);
}
}
// Trigger gallery selection for a photo
public void onPickPhoto() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
if (intent.resolveActivity(getPackageManager()) != null) {
galleryActivityResultLauncher.launch(intent);
}
}
private void onCropImage() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
grantUriPermission("com.android.camera", intermediateProvider, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(intermediateProvider, "image/*");
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);
int size = 0;
if(list != null) {
grantUriPermission(list.get(0).activityInfo.packageName, intermediateProvider, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
size = list.size();
}
if (size == 0) {
Toast.makeText(this, "Error, wasn't taken image!", Toast.LENGTH_SHORT).show();
} else {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
File photoFile = getPhotoFileUri(resultName);
// wrap File object into a content provider
// required for API >= 24
// See https://guides.codepath.com/android/Sharing-Content-with-Intents#sharing-files-with-api-24-or-higher
resultProvider = FileProvider.getUriForFile(MainActivity.this, "com.photostream.crop.fileprovider", photoFile);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, resultProvider);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
Intent cropIntent = new Intent(intent);
ResolveInfo res = list.get(0);
cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
grantUriPermission(res.activityInfo.packageName, resultProvider, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
cropIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
cropActivityResultLauncher.launch(cropIntent);
}
} else {
File photoFile = getPhotoFileUri(resultName);
resultProvider = Uri.fromFile(photoFile);
Intent intentCrop = new Intent("com.android.camera.action.CROP");
intentCrop.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intentCrop.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intentCrop.setDataAndType(intermediateProvider, "image/*");
intentCrop.putExtra("crop", "true");
intentCrop.putExtra("scale", true);
intentCrop.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intentCrop.putExtra("noFaceDetection", true);
intentCrop.putExtra("return-data", false);
intentCrop.putExtra(MediaStore.EXTRA_OUTPUT, resultProvider);
cropActivityResultLauncher.launch(intentCrop);
}
}
// Returns the File for a photo stored on disk given the fileName
public File getPhotoFileUri(String fileName) {
File mediaStorageDir = new File(getExternalFilesDir(""), APP_TAG);
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()){
Log.d(APP_TAG, "failed to create directory");
}
File file = new File(mediaStorageDir.getPath() + File.separator + fileName);
return file;
}
public Bitmap loadFromUri(Uri photoUri) {
Bitmap image = null;
try {
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1){
// on newer versions of Android, use the new decodeBitmap method
ImageDecoder.Source source = ImageDecoder.createSource(this.getContentResolver(), photoUri);
image = ImageDecoder.decodeBitmap(source);
} else {
// support older versions of Android by using getBitmap
image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), photoUri);
}
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
private void saveBitmapFileToIntermediate(Uri sourceUri) {
try {
Bitmap bitmap = loadFromUri(sourceUri);
File imageFile = getPhotoFileUri(intermediateName);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
intermediateProvider = FileProvider.getUriForFile(MainActivity.this, "com.photostream.crop.fileprovider", imageFile);
else
intermediateProvider = Uri.fromFile(imageFile);
OutputStream out = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
int width = image.getWidth();
int height = image.getHeight();
float bitmapRatio = (float)width / (float) height;
if (bitmapRatio > 1) {
width = maxSize;
height = (int) (width / bitmapRatio);
} else {
height = maxSize;
width = (int) (height * bitmapRatio);
}
return Bitmap.createScaledBitmap(image, width, height, true);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.photostream.crop">
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<intent>
<action android:name="com.android.camera.action.CROP" />
</intent>
<intent>
<action android:name="android.intent.action.PICK" />
<data android:mimeType="vnd.android.cursor.dir/image" />
</intent>
</queries>
<application
android:allowBackup="true"
android:largeHeap="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Test">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.photostream.crop.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider" />
</provider>
</application>
</manifest>
它在 Android 11 上运行良好。您也可以引用 Github 上的关注项目。 https://github.com/bigant02/image-crop
关于java - 首次安装应用程序时无法解析 android 11 中的 com.android.camera.action.CROP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64571762/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!