Rob*_*hof 5 android uri deep-linking
从Chrome 文档中,我了解到可以使用以下 URI 打开应用程序
intent:
HOST/URI-path // Optional host
#Intent;
package=\[string\];
action=\[string\];
category=\[string\];
component=\[string\];
scheme=\[string\];
end;
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以从我的应用程序打开这个 URI。
示例 URI
intent:
//qr/json/%7B%22u%22%3A%22https%3A%2F%2Fprivacybydesign.foundation%2Fbackend%2Firma%2Fsession%2FvsRjkZF2B2H17sBWmVZe%22%2C%22irmaqr%22%3A%22disclosing%22%7D
#Intent;
package=org.irmacard.cardemu;
scheme=cardemu;
l.timestamp=1620907855707;
S.browser_fallback_url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dorg.irmacard.cardemu
;end
Run Code Online (Sandbox Code Playgroud)
由于它看起来像一个普通的 URI,我想我可以这样打开它:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("%EXAMPLE_URI%"));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这给了我一个ActivityNotFoundException. 我错过了什么?
引起:android.content.ActivityNotFoundException:没有找到处理意图的活动{ act=android.intent.action.VIEW dat=intent://qr/json/{"u":"https://privacybydesign.foundation/backend /irma/session/vsRjkZF2B2H17sBWmVZe","irmaqr":"disclosure"} pkg=org.irmacard.cardemu(有附加功能)}
您可以尝试以下几件事:
1. 确保您要启动的应用程序已实现正确的意图。
<application android:label="@string/app_name">
...
<activity android:name=".PleaseStartThisActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
</activity>
...
</application>
Run Code Online (Sandbox Code Playgroud)
2. 始终使用新意图,切勿重复使用旧意图。
Intent intent = new Intent(android.content.Intent.ACTION_VIEW); //OK.
// Intent intent = getIntent(); //Not OK.
Run Code Online (Sandbox Code Playgroud)
3. 把其他一切都设置好。
// If package name and activity are known.
intent.setComponent(new ComponentName("org.irmacard.cardemu", "org.irmacard.cardemu.PleaseStartThisActivity"));
// Else
// intent = new Intent(android.content.Intent.ACTION_GET_CONTENT);
// intent.setDataAndType(Uri.parse("file://" + filePath), "text/plain");
Run Code Online (Sandbox Code Playgroud)
4. 设置或添加标志可能会有所帮助
intent.setFlags(
android.content.Intent.FLAG_ACTIVITY_FORWARD_RESULT |
android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP |
android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES |
android.content.Intent.FLAG_RECEIVER_FOREGROUND |
android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION |
android.content.Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION |
android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION |
android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)
5. 现在您可以安全地开始活动了。
startActivity(intent);
// Or this:
// startActivity(android.content.Intent.createChooser(intent, null));
Run Code Online (Sandbox Code Playgroud)
编辑
* intent.getDataString() - To get intent data (You may have to parse it to get the package name).
* getPackageManager().queryIntentActivities() - To check available activities for that package like the following example:
Run Code Online (Sandbox Code Playgroud)
private final String getActivity(final String packageName, final Intent intent, final Bundle bundle, final String mimeType) {
final String activity;
int activityLen = 0;
final int packageLen = packageName.length();
if(bundle != null && (activity = bundle.getString("activity")) != null) {
activityLen = activity.length();
} else {
activity = null;
}
final List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
for(ResolveInfo ri : list) {
final IntentFilter filter = ri.filter;
final String activityName = ri.activityInfo.name;
//Make sure the activity is valid and exist for the package.
//Tolerate with case insensitive
if(activity != null && activity.regionMatches(true, 0, activityName, 0, activityLen)
&& packageName.regionMatches(true, 0, ri.activityInfo.packageName, 0, packageLen)) {
return activityName;
} else if(filter == null) {
Toast.makeText(this, "ERROR: No available ACTIONS to handle this file", 1).show();
return null;
//Auto search only if user hasn't specified the activity, else return null. Tolerate with case insensitive
} else if(activity == null && filter.hasAction(intent.getAction()) && filter.hasDataType(mimeType)) {
if(ri.activityInfo.packageName.regionMatches(true, 0, packageName, 0, packageLen)) {
return ri.activityInfo.name;
}
} // Else keep validating next activities
}
if(activity == null) {
Toast.makeText(this, "ERROR: No available ACTIVITIES to open this file", 1).show();
} else {
Toast.makeText(this, "ERROR: No such activity found", 1).show();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |