[英]How to launch activity from non-activity class and receive the onActivityResult() on the activity class
我有一個 class 從片段延伸,另一個 class,這是一個非活動 class 啟動一些意圖(相機相關的東西)。
我將第一個傳遞給第二個的構造函數,以便第二個可以執行意圖的創建並啟動它們。 但我希望onActivityResult
在活動方面被調用,片段,但它永遠不會被調用。 我做錯了什么?
片段 class:
public class MyFragment extends Fragment
{
private static final String TAG = "Example";
private NonActivityClass nonActivityClass = null;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
RequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
nonActivityClass = new NonActivityClass(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
Log.d(TAG, "ON RESULT");
if (requestCode == NonActivityClass.REQUEST && resultCode == RESULT_OK)
{
Log.d(TAG, "ON RESULT!");
}
}
}
非活動 class:
public class NonActivityClass
{
private Activity activity;
static final int REQUEST = 1;
public NonActivityClass(Activity activity)
{
this.activity = activity;
}
private Activity getActivity()
{
return this.activity;
}
public void DispatchTakePictureIntent()
{
PackageManager packageManager = getActivity().getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY))
{
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(packageManager) != null)
{
// Create the File where the photo should go
File photoFile = null;
try
{
photoFile = CreateImageFile(); //this method creates the temporary file, shouldn't be relevant
}
catch (IOException ex)
{
Log.d(TAG, "Error occurred while creating the File:" + ex.toString());
}
// Continue only if the File was successfully created
if (photoFile != null)
{
Uri photoURI = FileProvider.getUriForFile(getActivity(),
"com.example.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//THIS
getActivity().startActivityForResult(takePictureIntent, REQUEST);
//
}
}
}
}
}
編輯:即使遵循這個答案: 從非活動 class 調用 startActivityForResult() 並在現有活動或片段中獲取結果
而不是傳遞傳遞片段的活動,它不調用 onResult。
仔細查看我在問題上發布的答案: 從非活動 class 調用 startActivityForResult() 並在現有活動或片段中獲得結果
我注意到問題是我從 Activity 調用 startActivityForResult(),應該從片段調用。 因此,我沒有將 Activity 傳遞給我的 class,而是折射為使用 Fragment 的答案。
所以片段代碼看起來像:
public class MyFragment extends Fragment
{
private static final String TAG = "Example";
private NonActivityClass nonActivityClass = null;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
RequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
nonActivityClass = new NonActivityClass(this); //this, instead of getActivity()
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
Log.d(TAG, "ON RESULT");
if (requestCode == NonActivityClass.REQUEST && resultCode == RESULT_OK)
{
Log.d(TAG, "ON RESULT!");
}
}
}
和非活動 class 像:
public class NonActivityClass
{
private Fragment fragment;
static final int REQUEST = 1;
public NonActivityClass(Fragment fragment)
{
this.fragment = fragment;
}
private Activity getActivity()
{
return this.fragment.activity;
}
public void DispatchTakePictureIntent()
{
Log.d(TAG, "DISPATCH");
PackageManager packageManager = getActivity().getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY))
{
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(packageManager) != null)
{
// Create the File where the photo should go
File photoFile = null;
try
{
photoFile = CreateImageFile(); //this method creates the temporary file, shouldn't be relevant
}
catch (IOException ex)
{
Log.d(TAG, "Error occurred while creating the File:" + ex.toString());
}
// Continue only if the File was successfully created
if (photoFile != null)
{
Uri photoURI = FileProvider.getUriForFile(getActivity(),
"com.example.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//THIS
fragment.startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
//
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.