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();
}
});
}
}
'Android(Java)' 카테고리의 다른 글
[Java] WebView Wrapper Class (0) | 2024.02.27 |
---|---|
[Android]안드로이드 xml에서 투명도 적용 (0) | 2024.02.22 |
[Java-중요] Permission 여러개 한번에 설정 요청 하기 (1) | 2024.02.19 |
[Java] 홈버튼 및 백그라운드 앱 전체 보기시 이벤트 제어 (0) | 2024.02.14 |
[Java] 화면 켜짐 상태 유지 설정 / 해제 (0) | 2024.02.14 |