从画廊返回后,不在 Fragment 中调用 onActivityResult
Posted
技术标签:
【中文标题】从画廊返回后,不在 Fragment 中调用 onActivityResult【英文标题】:not call onActivityResult in Fragment, after return from gallery 【发布时间】:2019-11-19 23:39:27 【问题描述】:在我的片段中,我从图库中选择照片
在 Manifest.xml 中
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在此之前,我的应用显示权限对话框。我按允许
public class EditProfileFragment extends androidx.fragment.app.Fragment
private void choosePhotoFromGallery()
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
但是方法
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (BuildConfig.DEBUG)
Log.d(TAG, "onActivityResult_requestCode = " + requestCode + ", resultCode = " + resultCode + ", data = "
+ AndroidUtil.intent2String(data));
not call在Fragment返回我的应用后
不打印文本:onActivityResult_requestCode
但是方法 onActivityResult(int requestCode, int resultCode, Intent data) 在Activity中调用。 但是我需要在片段中调用这个方法。
这里请求权限对话框:
private boolean checkAndRequestPermissions()
int writeExternalStorage = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
int readExternalStorage = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);
int camera = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
List<String> listPermissionsNeeded = new ArrayList<>();
if (writeExternalStorage != PackageManager.PERMISSION_GRANTED)
listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (readExternalStorage != PackageManager.PERMISSION_GRANTED)
listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
if (camera != PackageManager.PERMISSION_GRANTED)
listPermissionsNeeded.add(Manifest.permission.CAMERA);
if (BuildConfig.DEBUG)
Log.d(TAG, "checkAndRequestPermissions_listPermissionsNeeded(" + listPermissionsNeeded.size() + ")");
if (!listPermissionsNeeded.isEmpty())
if (BuildConfig.DEBUG)
Log.d(TAG, "checkAndRequestPermissions_REQUEST_WRITE_EXTERNAL_STORAGE_REQ_CODE");
ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()])
, WRITE_EXTERNAL_STORAGE_REQ_CODE);
return false;
return true;
【问题讨论】:
您是否在清单中指定了这些权限并读取外部存储?? 是的,我更新了我的帖子 放入日志并检查是否发生异常。 将权限读取外部存储放入清单中... 你在使用片段吗?从哪里调用choosePhotoFromGallery() 【参考方案1】:把这个放在你的Activity on Activity Result
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frameLayout);
fragment.onActivityResult(requestCode, resultCode, data);
它将做的是调用片段的 onActivityResult 片段。所以你的片段中会有选择数据
Inside Fragment Start Activity For Result
getActivity().startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
活动中
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
super.onActivityResult(requestCode, resultCode, data);
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frameLayout);
fragment.onActivityResult(requestCode, resultCode, data);
内部片段
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
// super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "Activit Result");
if (resultCode == -1)
希望对你有所帮助
【讨论】:
方法 onActivityResult 在活动中调用。但是我需要在片段中调用这个方法 它将如何工作,在片段中您将调用 getActivity.startActivityForResult。当您选择照片时,它将向活动发送数据,并在活动 onActivityResult 中粘贴此代码,以便将数据发送回您的片段,您可以在其中使用该数据 在 android 6.0 之前,我的代码可以工作。现在我需要更新我的代码。为什么?谷歌改变政策以使用照片?【参考方案2】:既然你是从片段调用,那么试试这个
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.your_tag);
fragment.onActivityResult(requestCode, resultCode, data);
【讨论】:
以上是关于从画廊返回后,不在 Fragment 中调用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章
zxing onActivityResult 不在 Fragment 中仅在 Activity 中调用
从 Fragment 返回时,Flow onEach/collect 被多次调用
从 Fragment 类调用 Web 服务(API)的正确方法