2014-09-13 28 views
0

在Android上工作我正在創建一個SDK,創建一個服務以在客戶端應用程序上顯示覆蓋圖。 我希望能夠使用擴展Service類的類的上下文創建ImageView和其他小部件。 這是我正在做的減少版本。如何使用服務的上下文創建ImageView

public class MyService extends Service { 

private WindowManager windowManager; 
private ImageView myImage; 


@Override 
public void onCreate(){ 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 
    return START_NOT_STICKY; 
} 

public void startService (Context ctx) { 
    context = ctx; 
    Intent intent = new Intent(ctx, MyService.class); 
    ctx.startService(intent); 
    // have also tried new Intent(this, MyService.class); 
    // startService(intent); 

} 

public void displayMyImage() { 
    if (chatHead == null) { 
     chatHead = new ImageView(this);// explodes here due to null 
    } 
    chatHead.setImageResource(R.drawable.myimage); 

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.BOTTOM | Gravity.LEFT; 
    params.x = 10; 
    params.y = 100; 


    windowManager.addView(chatHead, params); 


} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (chatHead != null) windowManager.removeView(chatHead); 
} 

我上線chatHead = new ImageView(this)

我想這是從這篇文章http://www.piwai.info/chatheads-basics/他們使用它來創建服務中的形象圖,其中的原因得到java.lang.NullPointerException。我怎樣才能讓它使用服務的上下文,而不需要我傳遞客戶端/主機應用程序的上下文?

編輯:剛剛在完整的錯誤把從日誌

java.lang.NullPointerException 
at android.content.ContextWrapper.getResources(ContextWrapper.java:89) 
at android.view.View.<init>(View.java:3438) 
at android.widget.ImageView.<init>(ImageView.java:114) 
+0

您是否嘗試使用'getApplicationContext()'而不是'this'? – Apoorv 2014-09-13 07:44:03

+0

剛剛嘗試過。相同的空指針異常java.lang.NullPointerException at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) – glogic 2014-09-13 07:51:49

+0

@glogic可能是你從錯誤的地方調用了displayMyImage。我用你的代碼,並從onCreate和ImageView調用displayMyImage成功添加到屏幕上。 – Bracadabra 2014-09-13 08:19:33

回答

0

最簡單的解決方案是創建應用類項目的下一個全球應用環境。

在應用程序類

寫如下的代碼來intitialize您的來龍去脈和anywhere.It訪問將被初始化時,你的應用程序starts.and它會解決您的NPE

對於應用類代碼:

公共類MyApplication的擴展應用{

private static Context context; 

public void onCreate(){ 
    super.onCreate(); 
    MyApplication.context = getApplicationContext(); 
} 

public static Context getAppContext() { 
    return MyApplication.context; 
} 

}

現在修改您的displayImage樣T他:

public void displayMyImage() { 
if (chatHead == null) { 
    chatHead = new ImageView(MyApplication.getAppContext());// NPE won't occur 
...... 
} 
} 
+0

有一個可以在庫中擴展應用程序的類是否安全?比方說,有人將aar文件放入他們的項目中,他們也有一個擴展應用程序的類。不會導致問題? (我非常不確定,因爲我仍然在學習所有這些) – glogic 2014-09-13 12:49:22

+0

這是絕對安全的,隨後是各種開發人員 – Chiradeep 2014-09-13 14:15:33

相關問題