簡體   English   中英

如何從非活動 class 啟動活動並在活動 class 上接收 onActivityResult()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM