registerForActivityResult 사용시 ios처럼 콜백으로 아무데서나 처리가 가능한줄 알았는데  onCreate나 onStart 에서 사용해야 에러가 안난다. 

[예제1] 퍼미션 요청 콜백

private lateinit var requestMultiplePermissionsLauncher: 
    ActivityResultLauncher<Array<String>>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

	findViewById<Button>(R.id.acceptButton).setOnClickListener { accepted() }
    
    requestMultiplePermissionsLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
            permissions.entries.forEach {
                //Handles permission result
            }
        }
}

private fun accepted() {
    if(requestPerms) {
        val permissions = arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.CAMERA)
        requestMultiplePermissionsLauncher.launch(permissions)
    }
}

 

[예제2] 파일앱에 다운로드 파일 저장

private ActivityResultLauncher<Intent> blobDownloadResult;
public String base64String;
//Activity
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_xxx)
    
    blobDownloadResult = ((WebviewActivity) getContext()).registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        //result.getResultCode()를 통하여 결과값 확인
                        if (result.getResultCode() == RESULT_OK) {
                            //ToDo
                            Intent intentData = result.getData();
                            Uri uri = intentData.getData();
                            Log.d("blobDownloadResult", uri.toString());

                            String tmp = base64String.split("\\,")[1];
                            byte[] pdfAsBytes = Base64.decode(tmp, 0);

                            OutputStream os = null;
                            try {
                                os = getContext().getContentResolver().openOutputStream(uri);
                                os.write(pdfAsBytes);
                                os.flush();
                            } catch (FileNotFoundException e) {
                                Log.e("Blob Download IO Exception", e.getMessage());
                                throw new RuntimeException(e);
                            } catch (IOException e) {
                                Log.e("Blob Download IO Exception", e.getMessage());
                                throw new RuntimeException(e);
                            }
                        }
                        if (result.getResultCode() == RESULT_CANCELED) {
                            //ToDo
                        }
                    }
                }

        );
}

					     .................
@JavascriptInterface
public void blob(final String filename, final String base64) throws IOException {
	Log.d("blob",base64);
    ((Activity)getContext()).base64String = base64;
    
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("application/pdf");
    intent.putExtra(Intent.EXTRA_TITLE, filename);
    blobDownloadResult.launch(intent);
}

 

 

[예제3] 일반 Activity

public class SplashActivity extends AppCompatActivity {
	ActivityResultLauncher<Intent> mPermissionResultLauncher;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        
        			.... 생략 .....
         mPermissionResultLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {

                    @Override
                    public void onActivityResult(ActivityResult o) {

                         if (result.getResultCode() == RESULT_OK) {
                            // 넘어온 데이터 처리
                            Intent intentData = result.getData();
                            boolean success = intentData.getBooleanExtra("success", false);
                            String dataType = intentData.getStringExtra("data_type");
                         } else {
                         	// 취소처리
                         }
                    }
                });
    }
    
    private void startPermission() {
        Intent intent = new Intent(SplashActivity.this, PermissionActivity.class);
        mPermissionResultLauncher.launch(intent);
    }
}


public class PermissionActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        
        			..... 생략 .....
        btnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("success", true);
                intent.putExtra("data_type", "test data!!");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

+ Recent posts