【发布时间】:2019-06-10 20:30:14
【问题描述】:
所以我正在编写这个应用程序,它需要从手机中选择个人资料图片,裁剪、压缩并将图片保存到内部存储器中的自定义位置,并将压缩位图设置为圆形图像视图中的预览。所有这些都在一个片段中。但是我的 onActivityResult 在片段内根本没有被调用。
这是我的代码:
ViewPagerAdapter.class
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:
return new ConfigurationFragment1();
case 1:
return new ConfigurationFragment2();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
ConfigurationFragment2.class
public class ConfigurationFragment2 extends Fragment {
CircularImageView profilePicker;
EditText user1NameInput;
Uri profileImageURI;
Bitmap compressedImageFile;
Boolean profileImageSet = false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_configuration_2, container, false);
profilePicker = rootView.findViewById(R.id.configuration_profile_picker);
user1NameInput = rootView.findViewById(R.id.configuration_name_1);
profilePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
else if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
else {
chooseProfilePicture();
}
}
});
return rootView;
}
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
{
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(resultCode == Activity.RESULT_OK)
{
assert result != null;
profileImageURI = result.getUri();
File thumbnailURI = new File(Objects.requireNonNull(profileImageURI.getPath()));
try
{
compressedImageFile = new Compressor(getActivity())
.setMaxHeight(500)
.setMaxWidth(500)
.setQuality(100)
.compressToBitmap(thumbnailURI);
}
catch (IOException e)
{
e.printStackTrace();
}
profilePicker.setImageBitmap(compressedImageFile);
String profilePictureFolder = "/com.testapp.app/";
String profilePictureUser1Name = "profilePicUser1.jpg";
String profilePictureUser1Path = Environment.getExternalStorageDirectory().toString() + profilePictureFolder + profilePictureUser1Name;
File imagePath = new File(profilePictureUser1Path);
FileOutputStream fos;
try {
if (!imagePath.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder);
wallpaperDirectory.mkdirs();
}
File file = new File(new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder), profilePictureUser1Name);
if (file.exists()) {
file.delete();
}
fos = new FileOutputStream(imagePath);
compressedImageFile.compress(Bitmap.CompressFormat.JPEG, 85, fos);
fos.flush();
fos.close();
profileImageSet = true;
} catch (FileNotFoundException e) {
Log.e("eRROR", e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
}
}
else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
{
assert result != null;
Exception error = result.getError();
}
}
}
}
和MainActivity.class
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
setTheme(R.style.AppThemeBlueStatusDarkText);
objectInstance();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setSwipeable(false);
viewPager.setCurrentItem(currentPage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
onActivityResult 代码在正常活动中完美运行,但在此片段中却没有。我该如何解决我的问题?谢谢!
【问题讨论】:
-
问题在于这个奇怪的
CropImage库。您必须使用Fragment.startActivityForResult,但该库可能正在使用Activity.startActivityForResult,因此它没有正确转发到片段。
标签: java android onactivityresult