android.content.ContextWrapper.getPackageManager中的java.lang.NullPointerException

时间:2010-09-09 09:32:55

标签: android

我收到此错误

java.lang.NullPointerException at android.content.ContextWrapper.getPackageManager

当我想要获取设备上所有已安装应用程序的列表时。

我有一台服务器在我的应用程序启动时启动,客户端ping服务器并要求获取已安装应用程序的列表。然后,服务器会询问getPackageManager()并获取所有已安装的应用程序。 但是getPackageManager会引发NullPointerException

服务器是用java编写的,是从我的android应用程序启动的。

有人可以告诉我缺少什么以及为什么会收到此错误?

请找到以下代码

public class ApplicationRecognition  extends Activity  {

    // android.os.Debug.waitForDebugger();


      Button buttonStart, buttonStop;



    @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        buttonStart = (Button) findViewById(R.id.buttonStart);
        buttonStop = (Button) findViewById(R.id.buttonStop);


        final SecurityModuleServer server = new SecurityModuleServer(5902);
        server.start();
        Toast.makeText(this, "Application Server is started", Toast.LENGTH_SHORT).show();

        buttonStart.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {

                   startService(new Intent(getBaseContext(), AppReconService.class));


            }});
        buttonStop.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {

                stopService(new Intent(getBaseContext(), AppReconService.class));

            }});
      }

    public String[] getInstalledApplications() 
        {
                 String[] appname =new String[10];                  
                 Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);
                 mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);                  
                 PackageManager manager = getPackageManager();
                 List<ResolveInfo> pkgAppsList = manager.queryIntentActivities(mainIntent, 0);
                 appname = new String[pkgAppsList.size()];
                 for(int i=0;i<pkgAppsList.size();i++)
                 {
                     appname[i]=pkgAppsList.get(i).activityInfo.packageName;
                 }




            return appname;
        }

}

服务器端代码 公共类SecurityModuleServer实现Observer,Runnable {     private int numberOfConnectedClient;     private Thread serverThread;     私有ServerSocket serverSocket;     private volatile boolean isServerRunning;

public SecurityModuleServer(final int port)
{
    numberOfConnectedClient = 0;

            try 
            {
                serverSocket = new ServerSocket(port);

            } catch (IOException e) {

                e.printStackTrace();
            }

}


public void run()
{

    System.out.println("SecurityModuleServer>> server thread started."); //$NON-NLS-1$

    while(isServerRunning)
    {
        numberOfConnectedClient++;
        try
        {               
            SecurityModuleClientThread client = new SecurityModuleClientThread(serverSocket.accept(), numberOfConnectedClient);
            client.addObserver(this);
            client.start();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    System.out.println("SecurityModuleServer>> server thread stopped."); //$NON-NLS-1$
}

synchronized public void start()
{
    serverThread = new Thread(this);
    isServerRunning = true;
    serverThread.start();
}

synchronized public void stop()
{
    isServerRunning = false;
}

public boolean isRunning()
{
    return isServerRunning;
}

public static void main(String[] args)
{
    SecurityModuleServer server = new SecurityModuleServer(5903);
    server.start();
}


public void update(Observable o, Object arg)
{
    numberOfConnectedClient--;
}

}

客户端代码

public SecurityModuleClientThread(Socket socket, int numberOfClient)
{

    clientSocket = socket;
    numberOfConnectedClient = numberOfClient;

    try
    {
        printOut = new PrintStream(clientSocket.getOutputStream());
        readerIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        clientThread = new Thread(this);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

public void run()
{
    Looper.prepare();
    String input = ""; //$NON-NLS-1$

    System.out.println("SecurityModuleClientThread>> thread started for client."); //$NON-NLS-1$

    if (numberOfConnectedClient <= MAX_ALLOWED_CLIENTS)
    {   
        printOut.println(CMD+Answer_Open_Connection+SEPARATOR+M002);            
        while(isClientRunning)
        {
                try
                {
                     input = readerIn.readLine();
                    System.out.println("Message received>> "+input); //$NON-NLS-1$

                    parseInputMessage(input);


                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
        }

    }
    else
    {   
        printOut.println(CMD+Error+SEPARATOR+M003);
        stop();

    }

    System.out.println("SecurityModuleClientThread>> thread stopped for client."); //$NON-NLS-1$
}

private void parseInputMessage(final String input)
{

        if (input.equalsIgnoreCase(CMD+Request_Close_Connection))
        {
            printOut.println(CMD+Answer_Close_Connection+SEPARATOR+M007);
            stop();
        }       
    else
    {
        String messages[] = input.split(SEPARATOR);

        // Parse the command
        switch(parseCommand(messages[0]))
        {
            case Request_Start_Application:
                if(parseApplicationName(input) != null)
                {
                    if(startAndroidApplication(parseApplicationName(input)))
                    {
                        // TODO
                        printOut.println(CMD+Answer_Start_Application);
                        startAndroidApplication(parseApplicationName(input));
                    }
                    else
                    {
                        printOut.println(CMD+Error+SEPARATOR+M004);
                    }
                }
                else
                {
                    printOut.println(CMD+Error+SEPARATOR+M004);
                }
                break;
            case Request_Stop_Application:
                if(parseApplicationName(input) != null)
                {
                    if (stopAndroidApplication(parseApplicationName(input)))
                    {
                        // TODO
                        printOut.println(CMD+Answer_Stop_Application);
                    }
                    else
                    {
                        printOut.println(CMD+Error+SEPARATOR+M004);
                    }
                }
                else
                {
                    printOut.println(CMD+Error+SEPARATOR+M004);
                }
                break;
            case Request_Application_Installed:

                String[] appnames = new String[provideInstalledApplication().length];
                appnames = provideInstalledApplication();
                for(int i=0;i<appnames.length;i++)
                {
                    printOut.println(appnames[i]);
                }       

                break;
            case Request_Application_Running:
                //TODO
                break;
         default:
             printOut.println(CMD+Error+SEPARATOR+M008);
             break;
        }

    }

}

private int parseCommand(String cmd)
{
    if (cmd.length() == 6)
    {
        return Integer.parseInt(cmd.substring(3, 6));
    }
    else
    {
        return 0;
    }
}

private String parseApplicationName(String message)
{
    if (message.length() > 6)
    {
        // TODO
        return message.substring(6, message.length());
    }
    else
    {
        return null;
    }
}

public synchronized void  start()
{
    isClientRunning = true;
    clientThread = new Thread(this);
    clientThread.start();
}

public synchronized void stop()
{
    printOut.close();

    try
    {
        readerIn.close();
        clientSocket.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        isClientRunning = false;
        setChanged();
        notifyObservers();
    }
}

public boolean isRunning()
{
    return isClientRunning;
}


public String[] provideInstalledApplication()
{
     String[] appnames = null;

     ApplicationRecognition apprecon = new ApplicationRecognition();
     appnames=new String[apprecon.getInstalledApplications().length];
     appnames = apprecon.getInstalledApplications();            
     return appnames;
}

public String[] provideRunningApplication()
{
    // TODO Auto-generated method stub
    return null;
}


public boolean startAndroidApplication(String applicationName)
{
    // TODO Auto-generated method stub
     ApplicationRecognition apprecon = new ApplicationRecognition();
    apprecon.startApplication(applicationName);
    return false;
}

public boolean stopAndroidApplication(String applicationName)
{
    // TODO Auto-generated method stub
    return false;
}

}

给我带来麻烦的主要部分是在getPackageManager中方法getInstalledApplications()下的ApplicationRecognition类中为null。 从客户端SecurityModuleClientThreadprovideInstalledApplication方法调用此方法。

有人可以告诉我哪里出错了。

0 个答案:

没有答案