2011-02-01 13 views
5

Tôi đang sử dụng resolveActivityInfo để xác định xem ứng dụng của tôi được thiết lập như là một launcher nhà:vấn đề với việc giải quyết các hoạt động cho một mục đích - resolveActivityInfo()

PackageManager pm = getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_HOME); 

    userHomePackage = intent.resolveActivityInfo(pm, 0).packageName; 
    userHomeActivityClass = intent.resolveActivityInfo(pm, 0).name;  
currentHomeLauncherName = intent.resolveActivityInfo(pm, 0).loadLabel(pm).toString(); 

nó hoạt động tốt trên giả lập và ba thiết bị android tôi có trên tay .

Gần đây tôi bắt đầu nhận được báo cáo lỗi từ người dùng và nhật ký lỗi cho thấy rằng resolveActivityInfo bị lỗi. Điều này xảy ra chỉ trên một vài điện thoại chạy trên Android 2.1 cập nhật 1 như tôi có thể nhìn thấy. Tôi đã nhận được nhiều nhận xét tích cực về ứng dụng của mình và một vài nhận xét tiêu cực vì vấn đề này.

Bất kỳ lời khuyên nào có thể sai?

java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.setAsHomeApplicationBeforeFroyo(Launcher.java:336) 

HOẶC

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myappname/com.myapp.myappname.Launcher}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2497) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2513) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1864) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4370) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141) 
    at com.myapp.myappname.Launcher.showNextActivity(Launcher.java:122) 
    at com.myapp.myappname.Launcher.onCreate(Launcher.java:59) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 
    ... 11 more 
java.lang.NullPointerException 
    at android.os.Parcel.readException(Parcel.java:1224) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418) 
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046) 
    at android.content.Intent.resolveActivityInfo(Intent.java:3790) 
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141) 
+2

Trường hợp ngoại lệ đặc biệt mà bạn đang encounteri ng không xuất hiện từ mã của bạn. Có lẽ nó là một ROM modded lỗi mà một số người đang sử dụng. – CommonsWare

+2

cảm ơn bạn đã trả lời! Tôi có nhiều báo cáo hơn bây giờ - một chút hơn 30 trong hai ngày qua - tất cả đều đến từ điện thoại samsung từ các nhà cung cấp dịch vụ khác nhau và tất cả đều chạy trên Android 2.1-update1. Nhưng tôi cũng có tỷ lệ 5 sao từ người dùng sử dụng cùng một kiểu điện thoại và chạy trên 2.1 cũng ... hãy tìm hình ... – mishkin

Trả lời

1

đã thực hiện một số nghiên cứu với nguồn Android và tôi có xu hướng đồng ý với Commonsware rằng mã của tôi là đúng. Tôi thực sự thiết kế lại nó 3 tuần trước để sử dụng packagemanager.resolveActivity thay vì intent.resolveactivity:

this.pm = context.getPackageManager(); 

    try { 
     Intent homeintent = new Intent(Intent.ACTION_MAIN); 
     homeintent.addCategory(Intent.CATEGORY_HOME); 
     homeintent.addCategory(Intent.CATEGORY_DEFAULT);// seems not needed here since This is a synonym for 
           // including 
     // the CATEGORY_DEFAULT in your supplied Intent per doc 

     this.resolveInfo = pm.resolveActivity(homeintent, PackageManager.MATCH_DEFAULT_ONLY); 

     ActivityInfo activityInfo = resolveInfo.activityInfo; 

     userHomeLauncherPackage = activityInfo.packageName; 
     userHomeLauncherClass = activityInfo.name; 

     userHomeLauncherName = activityInfo.loadLabel(pm).toString(); 

     if (userHomeLauncherClass.contains("ResolverActivity")) 
     userHomeLauncherName = ""; 

    } catch (Exception e) { 
     throw new Exception(e); 
    } 

Nó không giúp nên vẫn nhận được các lỗi này thỉnh thoảng ...

Dựa trên mã nguồn,

ComponentName Intent.resolveActivity (PackageManager pm)

hoặc

ActivityInfo Intent.resolveActivityI nfo (PackageManager chiều, int cờ)

cuộc gọi cùng một phương pháp được định nghĩa trong lớp android.app.ContextImpl:

thông tin ResolveInfo = pm.resolveActivity (this, PackageManager.MATCH_DEFAULT_ONLY)

và nó được định nghĩa như:

 @Override 
    public ResolveInfo resolveActivity(Intent intent, int flags) { 
     try { 
      return mPM.resolveIntent(
       intent, 
       intent.resolveTypeIfNeeded(mContext.getContentResolver()), 
       flags); 
     } catch (RemoteException e) { 
      throw new RuntimeException("Package manager has died", e); 
     } 
    } 

vào thời điểm này tôi đi đến kết luận rằng tôi không thể làm bất cứ điều gì về vấn đề này :(

+0

Tôi nhìn thấy cùng một vấn đề và đã đạt đến cùng một kết luận. Bạn đã báo cáo với Google chưa? –

+0

Tôi không nghĩ chúng ta nên đổ lỗi cho google - mã này hoạt động tốt trong trình mô phỏng và tôi đã thử tất cả các phiên bản của api. vì vậy nó phải là một cái gì đó với các nhà sản xuất phần vững. – mishkin

+0

Vấn đề này cũng xảy ra trên Nexus7: 'PackageManager manager = context.getPackageManager(); Danh sách hoạt động = manager.queryIntentActivities (intent, 0); ' –

4

Kevin từ Cuộn dây Tesla phần mềm tại đây. Xin lỗi vì sự chậm trễ trong việc trở lại với bạn. Đây là những gì tôi đang sử dụng để có được những thành phần chủ trong các ứng dụng của tôi:

public static ComponentName getHomeComponent(PackageManager PM) { 
    Intent home_intent = new Intent("android.intent.action.MAIN"); 
    home_intent.addCategory("android.intent.category.HOME"); 
    home_intent.addCategory("android.intent.category.DEFAULT"); 

    ComponentName cn = home_intent.resolveActivity(PM); 
    if (cn == null) 
     Log.v(TAG, "[Default] package:null"); 
    else 
     Log.v(TAG, "[Default] package:" + cn.getPackageName() + " class:" + cn.getClassName()); 

    return cn; 
} 

resolveActivity thường không trở về null, vì nó dường như trở lại hoạt động giải quyết nếu không có thiết lập mặc định. Nhưng trên một số điện thoại hoặc một cái gì đó nó có thể trở lại null chỉ để giữ cho mọi thứ thú vị. Có lẽ resolveActivityInfo gọi resolveActivity nhưng không xử lý đúng trường hợp null.

+0

cảm ơn Kevin! intent.resolveActivity khá giống với ý định.resolveActivityInfo và lỗi xảy ra bên trong các phương thức này vì vậy tôi không thể kiểm tra kết quả trên null, vì nó không thành công trước đó. Tôi hiện đang sử dụng trong 3 tuần pm.resolveActivity (homeintent, PackageManager.MATCH_DEFAULT_ONLY) thay vào đó, nhưng vẫn có một vài lỗi như thế mỗi ngày từ các điện thoại chạy trên 2.1. Tôi đoán nó là một lỗi trong một phần vững không phải của tôi – mishkin