2017-06-06 11 views
1

私はソースコードを持たないパッケージのテストに取り組んでおり、3つのボタンを3秒間押してパッケージを起動します。典型的な方法でパッケージを起動しようとすると、java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Intent.addFlags(int)エラーが発生します。以下は、私がgetContext代わりのgetTargetContextを使用してみました私のコードパッケージ名でアクティビティを起動する

@Before 
public void setup() { 
    //Initialize UiDevice instance 
    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 
    mDevice = UiDevice.getInstance(instrumentation); 

    mDevice.pressHome(); 

    final String launcherPackage = mDevice.getLauncherPackageName(); 
    assertThat(launcherPackage, notNullValue()); 
    mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); 

    Context context = InstrumentationRegistry.getTargetContext(); 
    final Intent intent = context.getPackageManager() 
      .getLaunchIntentForPackage(DEALER_DIAG_PACKAGE); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    context.startActivity(intent); 

    mDevice.wait(Until.hasObject(By.pkg(DEALER_DIAG_PACKAGE).depth(0)), LAUNCH_TIMEOUT); 
} 

である、しかし、誰かが意図がエクスポートされていない場合、私は関係なく、私は何をすべきか、パッケージをこのように起動しないことができないだろうと私に指摘しました。私は、誰もが、私はこのエラーを取得しています理由として任意の入力を持っていますコマンドadb logcat ActivityManager:V *:Fなどadb shell pm list packages -f

--------- beginning of main 
I/ActivityManager(2296): START u0 {flg=0x10000000 
cmp=com.android.systemui/.usb.UsbDebuggingActivity (has extras)} from uid 
1000 on display 0 
I/ActivityManager(2296): Displayed 
com.android.systemui/.usb.UsbDebuggingActivity: +184ms 
I/ActivityManager(2296): START u0 {act=android.intent.action.MAIN cat= 
[android.intent.category.HOME] flg=0x10200000 
cmp=com.android.launcher3/.Launcher} from uid 1000 on display 0 
I/ActivityManager(2296): START u0 
{act=com.REDACTED.auto.diagnostics.dealer.MAIN flg=0x10800000 
cmp=com.REDACTED.auto.diagnostics/.dealer.MainActivity} from uid 1000 on 
display 0 
I/ActivityManager(2296): Start proc 
20943:com.REDACTED.auto.diagnostics/1000 for activity 
com.REDACTED.auto.diagnostics/.dealer.MainActivity 
I/ActivityManager(2296): Displayed 
com.REDACTED.auto.diagnostics/.dealer.MainActivity: +572ms 

を使用してパッケージ名を取得しようとしましたか?私はlogcatダンプにリストされているすべてのパッケージ名を使ってみましたが、成功しませんでした。どんな入力も感謝します。

答えて

0

Brandonはおそらく別のソリューションで動作する可能性があります。ここに私の解決策があります:

これはおそらくBrandonの解決策と同じことですが、抽象度は低下します。

1

あなたが別のアプリを起動したい場合は、単に最初のこれらのアプリがインストールされているかどうかを確認、またはあなたがNullPointerException、その後、パッケージオプションで意図でアプリを起動得られます。ただ、このような

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.domain.anotherapp"); 
     if (launchIntent != null) { 
      startActivity(launchIntent);//null pointer check in case package name was not found 
     } 

これはおそらく、(あなたが特定のアクティビティを起動したい場合は、すでに他のアプリ側の要求を処理するために、または単に仕事クラッシュしたりしません方法を知っている必要があり、デフォルトのだせ活動でアプリを出せますいくつかの変数やデータを渡す必要があるかもしれませんこれらのアプリケーションの以前の情報)は、とにかくあなたが使用しなければならないこれらの特定の活動を開きます。ComponentName

Stringを2つ取り入れたComponentNameコンストラクタを使用して、別のアプリケーションのコンポーネントを参照することができます。しかし、最初の引数はクラスのパッケージ名ではありません。そのアプリケーションのパッケージ名 - そのアプリケーションのAndroidManifest.xmlmanifest要素のpackage属性です。だからあなたの最初の例では、コンストラクタは確かに独自のアプリケーション内のコンポーネントを参照するために使用することができることを

ComponentName cn = new ComponentName("com.domain.anotherapp", 
    "com.domain.anotherapp.widget.WidgetProvider"); 

する必要がありますが、あなたはすでに、独自のアプリケーションからContextのホールドを持っているので、あなたにもそれを使用して1を使用する場合があります他のコンストラクタの私の意見では、Classを取っている人は、いつでも使用できるようにするべきです。何らかの理由でクラスが動的にしかわからない場合は、Stringを使用することができます。その場合は、上記のように完全修飾クラス名を使用する必要があります。

意思によって起動(間違って渡された情報については、nullポインタ例外を処理せずに)するための完全な使用:

Intent launchIntent = new Intent(Intent.ACTION_MAIN); 
       launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
       ComponentName cn = new ComponentName("com.domain.anotherapp", 
       "com.domain.anotherapp.widget.WidgetProvider"); 
       launchIntent.setComponent(cp); 

       startActivity(launchIntent); 

参考:私は私のために働いた方法を考え出し https://developer.android.com/reference/android/content/ComponentName.html

関連する問題