2016-11-18 100 views
1

我试图做一个活动,我可以用相机或画廊上传图片到的ImageView后恢复活动。
在我的平板电脑,它工作正常,但在我的星系S4拍照与摄像头后,我无法还原活动。这里的logcat的:无法拍摄图片相机

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.gianluca.achieveme, PID: 27301 
       java.lang.RuntimeException: Unable to resume activity {com.example.gianluca.achieveme/com.example.gianluca.achieveme.AchievementCompleted}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.gianluca.achieveme/com.example.gianluca.achieveme.AchievementCompleted}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getPath()' on a null object reference 
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3403) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3434) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772) 
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4471) 
        at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1455) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:145) 
        at android.app.ActivityThread.main(ActivityThread.java:5951) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
       Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.gianluca.achieveme/com.example.gianluca.achieveme.AchievementCompleted}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getPath()' on a null object reference 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4067) 
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3389) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3434)  
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772)  
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4471)  
        at android.app.ActivityThread.access$1000(ActivityThread.java:177)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1455)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:145)  
        at android.app.ActivityThread.main(ActivityThread.java:5951)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:372)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)  
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getPath()' on a null object reference 
        at com.example.gianluca.achieveme.AchievementCompleted.onActivityResult(AchievementCompleted.java:126) 
        at android.app.Activity.dispatchActivityResult(Activity.java:6549) 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4063) 
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3389)  
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3434)  
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2772)  
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4471)  
        at android.app.ActivityThread.access$1000(ActivityThread.java:177)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1455)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:145)  
        at android.app.ActivityThread.main(ActivityThread.java:5951)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:372)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)  

我读这是因为使用相机浪费大内存量,我已经使用onSavedInstanceState和onRestoreInstanceState,但我想不出如何做到这一点。你能解释我吗?这也是我活动的Java代码:

public class AchievementCompleted extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{ 

public static TextView tvTitle; 
public static TextView tvDescription; 
public static Button bDate; 
public static Button bPosition; 
public static Switch switchbutton; 

private Uri imageCaptureUri; 
private ImageView mImageView; 
private static final int PICK_FROM_CAMERA=1; 
private static final int PICK_FROM_FILE=2; 

private Button bPhoto; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_achievement_completed); 

    tvTitle = (TextView)findViewById(R.id.titolo); 
    tvDescription = (TextView)findViewById(R.id.descrizione); 
    bDate = (Button)findViewById(R.id.data); 
    switchbutton = (Switch)findViewById(R.id.swtich); 

    Intent intent = getIntent(); 
    tvTitle.setText(intent.getStringExtra("Titolo")); 
    tvDescription.setText(intent.getStringExtra("Descrizione")); 

    switchbutton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     } 
    }); 

    final String[] items = new String [] {"Scatta foto", "Scegli dalla galleria"}; 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.select_dialog_item,items); 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Seleziona l'immagine"); 
    builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if(which==0){ 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File file = new File(Environment.getExternalStorageDirectory(),"tmp_avatar"+ String.valueOf(System.currentTimeMillis())+".jpg"); 
       imageCaptureUri = Uri.fromFile(file); 
       try{ 
        intent.putExtra(MediaStore.EXTRA_OUTPUT,imageCaptureUri); 
        intent.putExtra("return data",true); 

        startActivityForResult(intent,PICK_FROM_CAMERA); 
       }catch (Exception ex){ 
        ex.printStackTrace(); 
       } 
       dialog.cancel(); 
      }else{ 
       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent,"Completa l'azione usando"),PICK_FROM_FILE); 
      } 
     } 
    }); 
    final AlertDialog dialog=builder.create(); 
    mImageView=(ImageView)findViewById(R.id.immagine); 
    bPhoto = (Button)findViewById(R.id.btnFoto); 
    bPhoto.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dialog.show(); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode!=RESULT_OK) 
     return; 
    Bitmap bitmap = null; 
    String path=""; 
    if(requestCode==PICK_FROM_FILE){ 
     imageCaptureUri=data.getData(); 
     path=getRealPathFromURI(imageCaptureUri); 
     if(path==null) 
      path=imageCaptureUri.getPath(); 
     if(path!=null){ 
      BitmapFactory.Options mBitMapOption = new BitmapFactory.Options(); 
      mBitMapOption.inSampleSize=2; 
      bitmap= BitmapFactory.decodeFile(path,mBitMapOption); 
     } 

    }else{ 
     path=imageCaptureUri.getPath(); 
     BitmapFactory.Options mBitMapOption = new BitmapFactory.Options(); 
     mBitMapOption.inSampleSize=2; 
     bitmap= BitmapFactory.decodeFile(path,mBitMapOption); 
    } 
    mImageView.setImageBitmap(bitmap); 
} 

public String getRealPathFromURI(Uri contentURI){ 
    String[] proj={MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(contentURI,proj,null,null,null); 
    if(cursor==null) return null; 
    int column_index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 
} 

预先感谢您

+0

什么是行号126? –

+0

将此行添加到清单文件'' –

+0

path = imageCaptureUri.getPath();在onActivityResult在其他条件 –

回答

0

imageCaptureUri永远不会初始化。切换这两行:

if(requestCode==PICK_FROM_FILE) { imageCaptureUri=data.getData();

imageCaptureUri=data.getData(); 
if(requestCode==PICK_FROM_FILE) {  

所以初始化情况。

+0

仍然没有工作我尝试添加机器人:configChanges =“方向|屏幕尺寸“在上面的评论中建议Ankita Shah的清单中,它只是增加了该行 –