2014-07-03 37 views
2

在我的應用程序需要啓動的主要活動如下方式記錄在其他幾個線程上SO啓動應用程序主要活動:錯誤通過一個意圖在圖書館

final String packageName = getApplicationContext().getPackageName(); 
final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName); 
startActivity(launchIntent); 

上面的代碼行在我的Android庫項目中,我不知道在這個地方我的主要活動的類。

這在測試設備上通過USB接口部署應用程序時非常有用,但是在4.3設備上從Google Play安裝應用程序時發生此錯誤。

07-03 13:54:19.843:E/DatabaseUtils(2344):寫入例外包裹 07-03 13:54:19.843:E/DatabaseUtils(2344):java.lang.SecurityException異常:權限拒絕:用戶的獲取/設置設置要求以用戶-2運行,但是從用戶0進行調用;這需要android.permission.INTERACT_ACROSS_USERS_FULL 07-03 13:54:19.843:E/DatabaseUtils(2344):at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140) 07-03 13:54 :19.843:E/DatabaseUtils(2344):at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038) 07-03 13:54:19.843:E/DatabaseUtils(2344):at com.android.providers.settings .SettingsProvider.callFromPackage(SettingsProvider.java:607) 07-03 13:54:19.843:E/DatabaseUtils(2344):at android.content.ContentProvider $ Transport.call(ContentProvider.java:279) 07-03 13 :54:19.843:E/DatabaseUtils(2344):at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273) 07-03 13:54:19.843:E/DatabaseUtils(2344):at android.os.Binder .execTransact(Binder.java:388) 07-03 13:54:19.843:E/DatabaseUtils(2344):at com.android.server.SystemServer.init1(Native Method) 07-03 13:54:19.843:E/DatabaseUtils(2344):at com .android.server.SystemServer.main(SystemServer.java:2012) 07-03 13:54:19.843:E/DatabaseUtils(2344):at java.lang.reflect.Method.invokeNative(Native Method) 07-03 13:54:19.843:E/DatabaseUtils(2344):at java.lang.reflect.Method.invoke(Method.java:525) 07-03 13:54:19.843:E/DatabaseUtils(2344):at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046) 07-03 13:54:19.843:E/DatabaseUtils(2344):at com.android.internal.os.ZygoteInit.main(ZygoteInit。 java:862) 07-03 13:54:19.843:E/DatabaseUtils(2344):at dalvik.system.NativeStart.main(Native Method)

有人遇到同樣的問題嗎?

編輯
我沒有提到,在SO提到,「 android.permission.INTERACT_ACROSS_USERS_FULL是簽名級別的權限幾個線程您的應用程序將無法使用它之前,除非它。具有相同簽名的系統。

Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
Permission Denial: this requires android.permission.INTERACT_ACROSS_USERS_FULL What do I do about: this requires android.permission.INTERACT_ACROSS_USERS_FULL

但是,由於上面的代碼似乎被其他開發者使用,我仍然希望有一個解決方案。

編輯2
刪除堆棧不相關的問題。

回答

0

不幸的是系統沒有:

  • 拋出任何異常
  • 登錄的原因錯誤

我的問題中的例外與問題無關,並未記錄在其他設備上。

我們採用以下解決方法,對於現在所有設備的工作原理,解決這個問題,從Android庫推出的主要活動:

protected void startMainActivityWithWorkaround() throws NameNotFoundException, ActivityNotFoundException { 
    final String packageName = getPackageName(); 
    final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName); 
    if (launchIntent == null) { 
     Log.e(LOG_TAG, "Launch intent is null"); 
    } else { 
     final String mainActivity = launchIntent.getComponent().getClassName(); 
     Log.d(LOG_TAG, String.format("Open activity with package name %s/class name %s", packageName, mainActivity)); 
     final Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_LAUNCHER); 
     intent.setComponent(new ComponentName(packageName, mainActivity)); 
     // optional: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 
} 
+4

任何機會,你可以解釋什麼/你的解決方法如何工作? –

+0

你好!我得到了和你以前一樣的確切的錯誤,這很令人沮喪,因爲它可能會嚇壞你!雖然,當我嘗試建立UDP連接並向服務器發送消息時,出現錯誤...有什麼機會可以給我一些關於如何解決它的提示? – Vlad

+0

如上所述,SecurityException與啓動主要活動的問題無關。上述解決方法通過使用主活動類名重新創建一個意向來解決使用包管理器獲取null啓動意向的問題。 –

0

what-do-i-do-about-this-requires-android-permission-interact-across-users-full報價,

android.permission.INTERACT_ACROSS_USERS_FULL是簽名級別的權限。除非它與系統具有相同的簽名,否則您的應用程序將無法使用它。

UPDATE:

你有android.permission.WRITE_EXTERNAL_STORAGE

此鏈接可以幫助你 - How permission can be checked at runtime without throwing SecurityException?

您的關注 -

PackageManager pm = context.getPackageManager(); 
int hasPerm = pm.checkPermission(
    android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
    context.getPackageName()); 
if (hasPerm != PackageManager.PERMISSION_GRANTED) { 
    // do stuff 
} 
+0

是的,我已經讀過這個,應該在我的問題中提到它。但正如我看到其他程序員使用上述代碼,這應該是可能的...除非在一個Android API級別出現限制。 –

+0

這也許是一個很好的提示,上面的一行代碼訪問外部存儲,但我的應用程序具有WRITE_EXTERNAL_STORAGE權限。我會改善我的錯誤處理和搜索方式,謝謝。 –

0

檢查,以確保你沒有忘記添加一個活動你的清單。

+0

這不是問題,當你忘記在清單中添加一個活動時,你會得到一個明顯的異常ActivityNotFoundException。 –