android 为什么intent.resolveActivity(getPackageManager())返回空值,即使有Activity来处理它?

xoefb8l8  于 2022-12-02  发布在  Android
关注(0)|答案(3)|浏览(645)

我正在遵循Android Codelabs,特别是我正在使用隐式意图处理这个Codelab。
Codelab具有以下方法:

public void openWebsite(View view) {
   String url = mWebsiteEditText.getText().toString();

   Uri webpage = Uri.parse(url);
   Intent intent = new Intent(Intent.ACTION_VIEW, webpage);

   if (intent.resolveActivity(getPackageManager()) != null) {
       startActivity(intent);
   } else {
       Log.d("ImplicitIntents", "Can't handle this intent!");
   }
}

问题是intent.resolveActivity(getPackageManager())返回null,但如果我忽略它,只调用startActivity(intent),它就可以正常工作,并在Google Chrome中打开URI。
我想知道为什么intent.resolveActivity(getPackageManager())返回null,即使URI可以在Google Chrome中打开?

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.implicitintents">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

在本例中,我们要打开的URL来自EditText字段,因此我们不能将intent-filterandroid:host一起使用,如here所述。

jecbmhm3

jecbmhm31#

如果你还没有解决这个问题。我不知道你是否使用API级别30,但如果你是,你应该检查这个new Package visibility restrictions。软件包可见性已经改变,应用程序不再能够直接访问软件包管理器。你需要在你的AndroidManifest文件中添加一个元素。在你的情况下,你需要这样的东西。

<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>
hjzp0vay

hjzp0vay2#

我遇到了同样的问题。我通过在清单中添加一个使用浏览器的请求来解决它。现在我的清单文件看起来像这样。尝试阅读这个article

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.quakereport">
<queries>
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".EarthquakeActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
kwvwclae

kwvwclae3#

一大堆问题对我来说:
1.在Android清单中使用查询

<queries>
 <!-- WebView -->
 <intent>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.BROWSABLE" />
     <data android:scheme="http" />
 </intent>
 <intent>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.BROWSABLE" />
     <data android:scheme="https" />
 </intent>

 <!-- Camera -->
 <intent>
     <action android:name="android.media.action.IMAGE_CAPTURE" />
 </intent>

 <!-- Gallery -->
 <intent>
     <action android:name="android.intent.action.GET_CONTENT" />
 </intent>

1.移除

File sd_directory = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
 return File.createTempFile(new_name, ".jpg", sd_directory);

以及使用了

File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
      return new File(storageDir, imageFileName + ".jpg");

相关问题