Как запустить намерение для стороннего приложения? - PullRequest
0 голосов
/ 10 декабря 2018

Мне удалось запустить приложение с намерением, например:

public void startNewActivity(String packageName) {
    Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent == null) {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=" + packageName));
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(intent);
}

Вызывается следующим образом:

this.startNewActivity("com.seleuco.mame4droid");

Это работает, но я хотел запустить намерение непросто запустите приложение, а также непосредственно запустите игру.

Манифест MAME4Droid гласит:

    <activity android:name="com.seleuco.mame4droid.MAME4droid" android:label="@string/app_name"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:launchMode="singleTask"
      android:windowSoftInputMode="stateAlwaysHidden" android:theme="@style/Theme.MAME4droid">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:host="" android:scheme="file" />
            <data android:mimeType="application/zip" />
        </intent-filter>
    </activity>

Но я не могу найти правильный способ вызова действия VIEW.

Я попробовал это: (прокомментированные строки - это варианты, которые я пробовал)

public void startMAME4DroidGame(String game) {
    Toast.makeText(mContext, game, Toast.LENGTH_SHORT).show();
    String packageName = "com.seleuco.mame4droid";
    try {
            //Intent intent = new Intent(packageName + "/com.seleuco.mame4droid.MAME4droid");
            Intent intent = new Intent("com.seleuco.mame4droid/android.intent.action.VIEW");
            //intent.setAction(Intent.ACTION_VIEW);
            //intent.setData(Uri.parse("file://" + game));
            intent.setData(Uri.parse("file:" +   // also tried with "file://" +
            "/sdcard/"+Environment.DIRECTORY_DOWNLOADS+"/"+game));
            mContext.startActivity(intent);
    } catch(Exception e) {
            Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

В результате:

    No activity found to handle Intent
    { act=com.seleuco.mame4droid.MAME4Droid/android.intent.action.VIEW 
    dat=file:///sdcard/Download/starforc.zip }

Какой был бы правильный способ создать Намерение для нацеливания на эту конкретную деятельность

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Намерение с действием VIEW и в качестве данных URI файла делает свое дело.Я только что попробовал:

adb shell am start -a android.intent.action.VIEW -d file:///storage/emulated/0/MAME4droid/roms/myrom.zip -n com.seleuco.mame4droid/com.seleuco.mame4droid.MAME4droid

, где storage/emulated/0/MAME4droid/roms/myrom.zip - это файл моего диска.Он открывает приложение и запускает игру.

Он также работает из приложения:

final Intent intent = new Intent(Intent.ACTION_VIEW)
        .setData(Uri.parse("content:///storage/emulated/0/MAME4droid/roms/myrom.zip"))
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .setClassName("com.seleuco.mame4droid", "com.seleuco.mame4droid.MAME4droid");
context.startActivity(intent);

Однако на Android 24+ мне пришлось объявить провайдер файлов в манифесте:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

И xml с путем:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

Не знаю, почему, но когда я запускаю Intent из приложения, работает только content схема, file нет.

0 голосов
/ 10 декабря 2018

Если у вас есть оба приложения, вы можете просто добавить схему URL (глубокая ссылка) в ваше первое приложение (например, mame4droid: //) и обрабатывать все с этим.Это позволяет вам открыть это действие, используя простой URL, например, mame4droid: // openMyAct / file-uri. Вы должны зарегистрировать эту схему в AndroidManifest первого приложения и обработать их намерение делать все, что вы хотите.

Другой способ, при котором оба apks подписаны одной и той же подписью, это то, что вы пытаетесь сделать, вы уверены, что оба apks подписаны одной и той же подписью?

Также, если вы просто хотитеоткройте файл такого типа, вам нужно зарегистрировать расширение (как вы это сделали) и сделать что-то вроде

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), fileMimeType);
startActivity(intent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...