setImageResource导致崩溃

时间:2013-11-15 18:08:57

标签: java android android-layout imageview

在我的应用程序中,我在布局上显示图像(picattach.png)。附上照片后,图像应替换为另一张(picattached.png)。我的问题是应用程序崩溃了:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null,         request=65541, result=-1, data=Intent { dat=content://media/external/images/media/9688     flg=0x1 }} to activity {com.peekatucorp.peekatu/com.peekatucorp.peekatu.MainActivity}: java.lang.NullPointerException

当我在选择图像的onActivityResult中尝试setImageResource以显示已选择图像时。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.v("response", "Photo Selected");

     if(requestCode == 5 && data != null && data.getData() != null){
            b2.setImageResource(R.drawable.picattached);
            Uri _uri = data.getData();
            Log.v("response", "cp1/4");
            if (_uri != null) {
                //User has pick an image.
                Cursor cursor = getActivity().getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
                cursor.moveToFirst();
                Log.v("response", "cp2/4");
                //Link to the image
                final String imageFilePath = cursor.getString(0);
                Log.v("response", "cp3/4");
                uploadMsgPic = imageFilePath;
                Log.v("response", "4/4");
                cursor.close();
                media_attached=true;

            }

        }
        super.onActivityResult(requestCode, resultCode, data);

}

如果我删除:

b2.setImageResource(R.drawable.picattached);

该应用运行良好。

帮助。

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" 
>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/form"
    android:layout_alignParentTop="true"
    android:choiceMode="none"
    android:divider="#00000000"
    android:dividerHeight="@dimen/zerosize"
    android:footerDividersEnabled="false"
    android:headerDividersEnabled="false" 
    android:listSelector="@android:color/transparent">

</ListView>

<RelativeLayout
    android:id="@+id/form"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:background="@drawable/inputbg" >

        <EditText
            android:id="@+id/cr_room_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@+id/sendMessage"
            android:layout_weight="3"
            android:ems="10"
            android:hint="Enter Message"
            android:inputType="text" />

        <ImageView
            android:id="@+id/postpic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:src="@drawable/picattach" />

        <Button
            android:id="@+id/sendMessage"
            style="@style/SingleGradient"
            android:layout_width="35dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

ImageView

    ImageView b2 = (ImageView) v.findViewById(R.id.postpic);




b2.setOnClickListener(new View.OnClickListener() {


    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), 5);
    }
});

Full StackTrace

11-15 13:45:17.256: E/AndroidRuntime(17431): FATAL EXCEPTION: main
11-15 13:45:17.256: E/AndroidRuntime(17431): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65541, result=-1, data=Intent { dat=content://media/external/images/media/8897 flg=0x1 }} to activity {com.peekatucorp.peekatu/com.peekatucorp.peekatu.MainActivity}: java.lang.NullPointerException
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3367)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread.access$1100(ActivityThread.java:141)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.os.Looper.loop(Looper.java:137)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread.main(ActivityThread.java:5103)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at java.lang.reflect.Method.invokeNative(Native Method)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at java.lang.reflect.Method.invoke(Method.java:525)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at dalvik.system.NativeStart.main(Native Method)
11-15 13:45:17.256: E/AndroidRuntime(17431): Caused by: java.lang.NullPointerException
11-15 13:45:17.256: E/AndroidRuntime(17431):    at com.peekatucorp.peekatu.ChatRoomFragment.onActivityResult(ChatRoomFragment.java:92)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:161)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at com.peekatucorp.peekatu.MainActivity.onActivityResult(MainActivity.java:98)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.Activity.dispatchActivityResult(Activity.java:5322)
11-15 13:45:17.256: E/AndroidRuntime(17431):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3363)
11-15 13:45:17.256: E/AndroidRuntime(17431):    ... 11 more
11-15 13:45:35.896: E/SQLiteLog(17431): (3850) statement aborts at 34: [UPDATE cookies SET last_access_utc=? WHERE creation_utc=?] disk I/O error
11-15 13:45:35.916: E/SQLiteLog(17431): (1) statement aborts at 2: [COMMIT] cannot commit - no transaction is active

从开始到按钮监听器的完整chatfragment.java

package com.peekatucorp.peekatu;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockFragment;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

/**
 * Shows just a simple text
 * 
 * @author sbaltes
 */
public class ChatRoomFragment extends SherlockFragment {

  private String title;
  private com.peekatucorp.peekatu.DiscussArrayAdapter adapter;
    private ListView lv;
//  private LoremIpsum ipsum;
    private EditText editText1;
    private static Random random;
    private String selected_room;
    private String last_message;
    private Document responseDoc;
    private String type;
    private String user;
    private String responseString;
     private Timer timer;
     private String last_inbox_message;
     private ImageView b2;
     String picurl=null;
     String uploadMsgPic;
     Boolean m_iAmVisible=false;
     Boolean local=false;
     Boolean media_attached=false;
    //private SherlockFragmentActivity sfa;
    public AbstractTabStackNavigationActivity navact;
    public LayoutInflater inflaterr;



    @Override
    public void onPause (){
        super.onPause();
        Log.v("response", "Being Paused ");
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.v("response", "Photo Selected");

         if(requestCode == 5 && data != null && data.getData() != null){
                    Uri _uri = data.getData();
                Log.v("response", "cp1/4");
                //b2.setImageResource(R.drawable.picattached);
                if (_uri != null) {
                    //User has pick an image.
                    Cursor cursor = getActivity().getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
                    cursor.moveToFirst();
                    Log.v("response", "cp2/4");
                    //Link to the image
                    final String imageFilePath = cursor.getString(0);
                    Log.v("response", "cp3/4");
                    uploadMsgPic = imageFilePath;
                    Log.v("response", "4/4");
                    cursor.close();
                    media_attached=true;

                }

            }
            super.onActivityResult(requestCode, resultCode, data);

    }


    @Override
    public void onResume() { 
        super.onResume(); // setText() here 
        Log.v("response", "resumed");
        /*if(!uploadMsgPic.equalsIgnoreCase("")){
            b2.setImageDrawable(getResources().getDrawable(R.drawable.picattached));
            } */
        m_iAmVisible = true;
        if(type.equalsIgnoreCase("1")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("main");
        }else if(type.equalsIgnoreCase("2")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("");
        }else if(type.equalsIgnoreCase("3")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("delete_conv",user);
        }else if(type.equalsIgnoreCase("4")){
            MainActivity m = (MainActivity)getActivity();
            if(local)
                m.changeMenu("online_map_local");  
            else
                m.changeMenu("online_map_all");
            //m.changeMenu("online_map_local");  
        }else if(type.equalsIgnoreCase("5")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("main");  
        }
    //  sfa = this.getSherlockActivity();
        //this.getSupportActionBar().setTitle("asd");
    //  Intent i = this.getIntent();
        //String type = "1";//i.getExtras().getString("type");
        Log.v("response ", "messages type "+type);
        refreshChat();
    }




    private Bitmap decodeFile(File f, int SIZE) throws IOException{
        Bitmap b = null;

            //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        int scale = 1;
        if (o.outHeight > SIZE || o.outWidth > SIZE) {
            scale = (int)Math.pow(2, (int) Math.round(Math.log(SIZE / 
               (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();

        return b;
    }
    public void refreshChat(){
        if(!m_iAmVisible)
            return;
        if(type.equalsIgnoreCase("1")){
            SharedPreferences preferences = this.getActivity().getSharedPreferences("MyPreferences", this.getActivity().MODE_PRIVATE);

              String selected_public = preferences.getString("selected_room", "Adult Lobby");
            this.getSherlockActivity().getSupportActionBar().setTitle("Peek@u");
            this.getSherlockActivity().getSupportActionBar().setSubtitle(selected_public);


        getChatMessages();
        }else if(type.equalsIgnoreCase("2")){
            this.getSherlockActivity().getSupportActionBar().setTitle("Peek@u");
            this.getSherlockActivity().getSupportActionBar().setSubtitle("Private Messages");



            getInboxMessages();
        }else if(type.equalsIgnoreCase("3")){
            this.getSherlockActivity().getSupportActionBar().setTitle("Conversation");
            this.getSherlockActivity().getSupportActionBar().setSubtitle("Username");


            getUserMessages("1");
        }else if(type.equalsIgnoreCase("4")){
            this.getSherlockActivity().getSupportActionBar().setTitle("Online");

            //this.getSherlockActivity().getSupportActionBar().setSubtitle("Username");

            getUsers();
        }else if(type.equalsIgnoreCase("5")){
            SharedPreferences preferences = this.getActivity().getSharedPreferences("MyPreferences", this.getActivity().MODE_PRIVATE);

              String selected_public = preferences.getString("selected_room", "Adult Lobby");

            this.getSherlockActivity().getSupportActionBar().setTitle("Users in Room");
            this.getSherlockActivity().getSupportActionBar().setSubtitle(selected_public);
            //this.getSherlockActivity().getSupportActionBar().setSubtitle("Username");

            getUsersRoom();
        }

    }

    @Override
     public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            Log.v("response", "In frag's on save instance state ");
            outState.putString("response",responseString);
          //  outState.putS(outState);

            //outState.putSerializable("starttime", lv);

        }


    public void waitncall(Boolean failed){
        if(getActivity()==null)
            return;


        final SharedPreferences preferences = getActivity().getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
            if(preferences==null)
                return;
            int refresh = Integer.parseInt(preferences.getString("loggedin_refresh", "3"));
           if(failed){
               Toast.makeText(this.getActivity(), "Connection Error, retrying in 10 seconds.", 1).show();
               refresh=10;
           }
           timer = new Timer(); 
           timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if(getActivity()!=null)
                    getActivity().runOnUiThread(new Runnable() {
                         public void run() {
                            Log.v("response", "timer");         
                    //stuff that updates ui
                            timer.cancel();
                                refreshChat();

                        }
                    });
                }
            }, refresh*1000);//put here time 1000 milliseconds=1 second

    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }
  @Override
  public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
      super.onCreateView(inflater, container, savedInstanceState);

      uploadMsgPic = "";
      m_iAmVisible = true;
      final View v = inflater.inflate(R.layout.activity_discuss, container, false);
     // setRetainInstance(true);
      //last_message = "0";
      inflaterr = inflater;
       last_inbox_message = "99999999999";  
     /* if(type.equalsIgnoreCase("1")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("main");
        }else if(type.equalsIgnoreCase("2")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("");
        }else if(type.equalsIgnoreCase("3")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("delete_conv",user);
        }else if(type.equalsIgnoreCase("4")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("online_map");  
        }else if(type.equalsIgnoreCase("5")){
            MainActivity m = (MainActivity)getActivity();
            m.changeMenu("");  
        }*/
      final SharedPreferences preferences = this.getActivity().getSharedPreferences("MyPreferences", getActivity().MODE_PRIVATE);

      if(responseString.length()>0 && preferences.getString("roomchanged", "notchanged").equalsIgnoreCase("notchanged")){
          Log.v("response", "Resumed");

      }else{

          adapter = new DiscussArrayAdapter(inflater.getContext(), R.layout.listitem_discuss,Integer.parseInt(type),getTabStack());
          last_message = "1";
      }
      SharedPreferences.Editor editor = preferences.edit();
        //editor.putString("selected_room",");
        editor.putString("roomchanged", "notchanged");

      //responseString = "";
                      if(savedInstanceState!=null && false){

                          responseString = savedInstanceState.getString("response");
                        //  return super.onCreateView(inflater, container, savedInstanceState);

                      }



   // ((TextView) tv).setText(title);
    Log.v("response ", "onCreate ");

    Log.v("response ", "messages type ");
    //--SAVE Data
//  preferences = this.getSharedPreferences("MyPreferences", MODE_PRIVATE);  


    //--READ data       
    selected_room = preferences.getString("selected_room", "Lobby");
    Log.v("response ", "messages type ");
    //last_message = "1";
    Intent i = this.getActivity().getIntent();
    Log.v("response ", "messages type ");
    //String type = "1";//i.getExtras().getString("type");
    Log.v("response ", "messages type ");
    Log.v("response ", "messages type "+type);


//setContentView(R.layout.activity_discuss);

    if(type.equalsIgnoreCase("2") || type.equalsIgnoreCase("4") || type.equalsIgnoreCase("5")){

        v.findViewById(R.id.form).setVisibility(View.GONE); 
        //r;
    }
    random = new Random();
//  ipsum = new LoremIpsum();
    getActivity().getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    lv = (ListView) v.findViewById(R.id.listView1);

    if(lv==null)
        Log.v("response ", "lv null");
    //adapter = new DiscussArrayAdapter(inflater.getContext(), R.layout.listitem_discuss,Integer.parseInt(type),getTabStack());
    if(adapter==null)
        Log.v("response ", "adapter null");
    lv.setAdapter(adapter);
    Log.v("response ", "messages type ");
    if(type.equalsIgnoreCase("2") ){
        lv.setDivider(this.getResources().getDrawable(R.color.gray));
        lv.setDividerHeight(1);
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                OneComment clicked = adapter.getItem(position);

            /*    Fragment newFragment = CountingFragment.newInstance(mStackLevel);

                  // Add the fragment to the activity, pushing this transaction
                  // on to the back stack.
                  FragmentTransaction ft = sfa.getSupportFragmentManager().beginTransaction();
                  ft.replace(R.id.simple_fragment, newFragment);
                  ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                  ft.addToBackStack(null);
                  ft.commit();*/
                 MainActivity m = (MainActivity)getActivity();
                 final TabInfo tab = m.getCurrentTabInfo();
                    final ChatRoomFragment fragment = new ChatRoomFragment().setType("3").setNAV(m).setUser(clicked.userid);
                  //  fragment.setText(characters[position]);

                    // second, you push the fragment. It becomes visible and the up button is
                    // shown
                    m.pushFragment(tab, fragment);

            }
        });

        }else if(type.equalsIgnoreCase("4") ||type.equalsIgnoreCase("5") ){
            lv.setDivider(this.getResources().getDrawable(R.color.gray));
            lv.setDividerHeight(1);
            lv.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    OneComment clicked = adapter.getItem(position);

                /*    Fragment newFragment = CountingFragment.newInstance(mStackLevel);

                      // Add the fragment to the activity, pushing this transaction
                      // on to the back stack.
                      FragmentTransaction ft = sfa.getSupportFragmentManager().beginTransaction();
                      ft.replace(R.id.simple_fragment, newFragment);
                      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                      ft.addToBackStack(null);
                      ft.commit();*/
                     MainActivity m = (MainActivity)getActivity();
                     final TabInfo tab = m.getCurrentTabInfo();
                        final ProfileFragment fragment = new ProfileFragment().setUser(clicked.userid);
                      //  fragment.setText(characters[position]);

                        // second, you push the fragment. It becomes visible and the up button is
                        // shown
                        m.pushFragment(tab, fragment);                      

           }
           });

            }

        else{
        lv.setDivider(this.getResources().getDrawable(R.color.transparent));
        lv.setDividerHeight(0);


    }
    Button b1 = (Button) v.findViewById(R.id.sendMessage);

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

            if(!uploadMsgPic.equalsIgnoreCase("")){

                Log.v("response","Pic in storage");
                //PhotoUploadTask uploadpicmsg = new PhotoUploadTask();
                //uploadpicmsg.execute();
                sendPicMsg();
                }else{
                        sendMessage();
                    }
            // it was the 1st button
            //sendMessage();
            //Log.v("response","message sent");


            //adapter.add(new OneComment(true, editText1.getText().toString()));
            //editText1.setText("");
            //lv.setSelection(adapter.getCount() - 1);
          }
        });


    /*if(!uploadMsgPic.equalsIgnoreCase("")){
        b2.setImageResource(R.drawable.picattached);
    }else{
        b2.setImageResource(R.drawable.picattach);
    } */

    b2 = (ImageView) v.findViewById(R.id.postpic);
    b2.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), 5);

2 个答案:

答案 0 :(得分:0)

试试这个:

b2.setImageDrawable(getResources().getDrawable(R.drawable.picattached));

答案 1 :(得分:0)

该框架希望您首先调用它super.onActivityResult(requestCode, resultCode, data);并在之后应用您的请求处理if(requestCode == 5 && data != null && data.getData() != null){。如果不这样做会导致您NullPointerException。您应该像这样处理onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.v("response", "Photo Selected");

     if(requestCode == 5 && data != null && data.getData() != null){

P.S。这是一个cool article for ya