안녕하세요.
웹뷰에서 카카오 내비 실행 시 앱이 설치가 안되어있으면 아래 에러가 발생합니다.
혹시 어떤 부분을 확인해야 하는지 확인 부탁드립니다.
FATAL EXCEPTION: main
Process: {app 패키지 명}, PID: 28409
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=kakaonavi-sdk://navigate/… }
안녕하세요.
앱 실행 가능 여부를 먼저 확인한 뒤 실행 불가한 경우 fallback url 처리 부탁드립니다.
// Intent 생성
val intent = Intent.parseUri(request.url.toString(), Intent.URI_INTENT_SCHEME)
// 실행 가능한 앱이 있으면 앱 실행
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
Log.d(TAG, "ACTIVITY: ${intent.`package`}")
return true
}
// Fallback URL이 있으면 현재 웹뷰에 로딩
val fallbackUrl = intent.getStringExtra("browser_fallback_url")
if (fallbackUrl != null) {
view.loadUrl(fallbackUrl)
Log.d(TAG, "FALLBACK: $fallbackUrl")
return true
}
scheme에 intent가 포함되어있을 경우 아래 함수를 실행하고있습니다
알려주신 코드가 아래 함수에서 어떻게 추가되어야 하는지 알수있을까요
private boolean IntentSchemeParser(WebView view , String url) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if(getPackageManager().resolveActivity(intent , 0) == null){
String pakagename = intent.getPackage();
if(pakagename != null) {
Uri uri = Uri.parse("market://details?id="+pakagename);
intent = new Intent(Intent.ACTION_VIEW , uri);
startActivity(intent);
return true;
}
}
Uri uri = Uri.parse(intent.getDataString());
intent = new Intent(Intent.ACTION_VIEW , uri);
startActivity(intent);
return true;
} catch (URISyntaxException e) {
}
return false;
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
Log.d(TAG, “ACTIVITY: ${intent.package
}”)
return true
}
이 로직에서 packageManager 라는게 아래 에러가 뜨는데 뭘까요?
Cannot resolve symbol ‘packageManager’
예시는 kotlin으로 작성 되었는데요
java의 경우 기존처럼 getPackageManager() 하시면 됩니다.
카카오 내비를 설치하였는데도 fallbackurl 실행 로직으로 처리됩니다.
아래 코드에서 무엇이 문제일까요
private boolean IntentSchemeParser(WebView view , String url) {
try {
Log.i("debug-sspark","intent 실행");
Log.i("debug-sspark",url);
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if(getPackageManager().resolveActivity(intent , 0) == null){
Log.i("debug-sspark","설치 안되어있음");
String pakagename = intent.getPackage();
if(pakagename != null) {
Log.i("debug-sspark","마켓으로 이동");
Uri uri = Uri.parse("market://details?id="+pakagename);
intent = new Intent(Intent.ACTION_VIEW , uri);
startActivity(intent);
return true;
}
}
// 실행 가능한 앱이 있으면 앱 실행
if(getPackageManager().resolveActivity(intent , 0) != null){
Log.i("debug-sspark","설치 되어있으면 실행");
startActivity(intent);
return true;
}
String fallbackUrl = intent.getStringExtra("browser_fallback_url");
if (fallbackUrl != null) {
Log.i("debug-sspark","설치 안되어있는데 fallback url이 있는 경우 실행");
view.loadUrl(fallbackUrl);
return true;
}
Log.i("debug-sspark","그 외 실행");
Uri uri = Uri.parse(intent.getDataString());
intent = new Intent(Intent.ACTION_VIEW , uri);
startActivity(intent);
return true;
} catch (URISyntaxException e) {
}
return false;
}
AndroidManifest 내용 공유 부탁드립니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="{packagename}">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"> <!-- usesCleartextTraffic : http:// 접속 -->
<activity android:name=".MainActivity"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SplashActivity"
android:screenOrientation="portrait">
</activity>
<!-- FCM 메시지 수신 서비스 -->
<service android:name="com.plugever.client.FirebaseCloudMessage"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service
android:name="com.plugever.client.MainActivity"
android:foregroundServiceType="location"
>
</service>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.plugever.client.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
<queries>
<package android:name="com.sktelecom.tauth" /> <!-- skt -->
<package android:name="com.kt.ktauth" /> <!-- kt -->
<package android:name="com.lguplus.smartotp" /> <!-- lg -->
<package android:name="com.locnall.KimGiSa" />
</queries>
</manifest>
AndroidManifest 파일 공유 드립니다.
MainActivity.java 입니다
intent에 pacakagename이 없어 강제로 추가하고 앱이 설치 안되어있으면 startActivity 를 실행하도록 했는데
안되네요
안녕하세요.
intent를 수정하지 마시고 intent.resolveActivity(getPackageManager()) 로 실행 가능여부 확인 하도록 구현 부탁드립니다.