웹뷰에서 카카오 내비 미설치시 실행 오류

안녕하세요.

웹뷰에서 카카오 내비 실행 시 앱이 설치가 안되어있으면 아래 에러가 발생합니다.
혹시 어떤 부분을 확인해야 하는지 확인 부탁드립니다.

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 를 실행하도록 했는데
안되네요

  1. 하이브리드앱에 웹뷰가 있고 웹뷰에서 NavigationStart 함수를 실행하여 카카오 navi를 실행합니다.
  2. 실행하면 앱 자체가 종료됩니다.
    ------ 구글링 통해 진행 ------
  3. 안드로이드 스튜디오에서 (JAVA CODE) queries에 추가
  4. 다시 실행해도 안됨
    ------ fallback url 로직 추가 -----
  5. 설치가 안되어있으면 fallback url 로직 실행
  6. 설치가 되어있으면 앱 실행
    → 앱 실행 안됨

안녕하세요.

intent를 수정하지 마시고 intent.resolveActivity(getPackageManager()) 로 실행 가능여부 확인 하도록 구현 부탁드립니다.