gpt4 book ai didi

java - 首次安装应用程序时无法解析 android 11 中的 com.android.camera.action.CROP

转载 作者:行者123 更新时间:2023-12-05 08:49:10 32 4
gpt4 key购买 nike

我开始在 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com