首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在本机上,在Android上,canOpenURL失败& OpenURL抛出一个错误:无法打开URL

在本机上,在Android上,canOpenURL失败& OpenURL抛出一个错误:无法打开URL
EN

Stack Overflow用户
提问于 2022-05-12 04:09:12
回答 2查看 1.7K关注 0票数 0

React-Native移动应用程序中,如果Linking.canOpenURL引用应用程序屏幕,则Linking.canOpenURLLinking.openURL会失败,而当引用HTTPS时则会运行。我怀疑这是Android权限的问题。我还没有在iOS上试过。知道我错过了什么吗?

我的代码:

代码语言:javascript
运行
复制
// const url = "https://google.com"; // works 
const url = "casualjob://"; // does NOT work 

Linking.canOpenURL(url)
.then( (supported) => {
    // execution reaches this point -> supported: false 
    console.log("canOpenURL - ", "supported:", supported, ); 
});

Linking.openURL(url) 
    .then(() => { 
        console.log("openURL -URL was opened successfully");
    })
    .catch((err) => {
        // execution reaches this point -> Error: Could not open URL 'casualjob://': No Activity found to handle Intent { act=android.intent.action.VIEW dat=casualjob:// flg=0x10000000 
        console.error("openURL - failed - err:", err, ) 
    }); 

AndroidManifest.xml:

代码语言:javascript
运行
复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.casualjob">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-feature android:name="android.hardware.camera.front" android:required="false" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application 
      android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" 
      android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme" 
      android:requestLegacyExternalStorage="true" 
  >
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
        <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>

        <activity 
            android:name=".MainActivity" 
            android:label="@string/app_name" 
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" 
            android:launchMode="singleTask" 
            android:windowSoftInputMode="adjustResize" 
        >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="casualjob"/>
                
                <data android:scheme="http"  android:host="buildwebsitepro.com.au/casualjob"/>
                <data android:scheme="https" android:host="buildwebsitepro.com.au/casualjob"/>
            </intent-filter>
        </activity>
    </application>

   <queries>
      <intent>
         <action android:name="android.intent.action.VIEW" />
            <data android:scheme="casualjob"/>
      </intent>
   </queries>
</manifest>
EN

回答 2

Stack Overflow用户

发布于 2022-05-12 09:59:04

有关Deeplink集成,请参阅此插件反应-本机-深度连接

您的URL应该是这样的

代码语言:javascript
运行
复制
const url = "https://buildwebsitepro.com.au" 

之后,您需要首先初始化用于Android的Dee-link事件。

代码语言:javascript
运行
复制
Linking.getInitialURL()
    .then(ev => {
      if (ev && ev !== '') {
        handleUrl({url: ev});
      }
    })
    .catch(err => console.log('An error occurred', err));

  function handleUrl({url}: {url: string | null}) {
  const deepLinkURL = url;
  if (deepLinkURL) {
   Linking.canOpenURL(deepLinkURL).then(supported => {
     if (supported) {
       DeepLinking.evaluateUrl(deepLinkURL);
     }
   });
 }

}

您需要像下面这样更改MenifestFile

代码语言:javascript
运行
复制
    <data android:host="casualjob" android:scheme="buildwebsitepro" />

最后注册路由

代码语言:javascript
运行
复制
DeepLinking.addRoute('/test/:id', (response) => {
 // example://test/23
 console.log(response.id); // 23
});
票数 0
EN

Stack Overflow用户

发布于 2022-05-16 02:48:05

我发现问题是<data>定义之间的冲突。以下是显示所需修改的摘录。

AndroidManifest.xml:

代码语言:javascript
运行
复制
<manifest ...>
...

    <application ...>
...
        <activity ...>
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="casualjob"/>
                
                <!-- It seems that the following 2 data statements are conflicting with the one above. So, I removed them. --> 
                <!-- <data android:scheme="http"  android:host="buildwebsitepro.com.au/casualjob"/>
                <data android:scheme="https" android:host="buildwebsitepro.com.au/casualjob"/> --> 
            </intent-filter>
        </activity>
    </application>
</manifest>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72210042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档