2016-10-15 4 views
0

Я использую этот код для создания простых приложений для камер. Я могу сделать снимок. Тем не менее, кража приложения после съемки.Сбой приложения после снятия фото

{ 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);      

    File imageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "abc.jpg"); 


    Uri store= Uri.fromFile(imageFile); 
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, store); 
    intent.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 0); 
    startActivityForResult(intent, 0); 
} 

/*************************************** onActivityResult ** ***************************************/

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 0) { 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        if (imageFile.exists()) 
        { 
         Toast.makeText(this, "The file was saved at " + imageFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); 
        } 
        else 
        { 
         Toast.makeText(this, "Error saving the file ", Toast.LENGTH_LONG).show(); 
        } 
         break; 
       case Activity.RESULT_CANCELED: 
          break; 
         default: 
          break; 
        } 
      } 
     } 

Ниже приводится логарифм.

java.lang.RuntimeException: Ошибка доставки результат ResultInfo {кто = NULL, запрос = 0, результат = -1, данных = NULL} в деятельности {com.camera/com.camera.MainActivity}: Java. lang.NullPointerException: Попытка вызвать виртуальный метод 'булевы java.io.File.exists()' на нулевой ссылки

объекта на android.app.ActivityThread.deliverResults (ActivityThread.java:3758)

на android.app.ActivityThread.handleSendResult (ActivityThread.java:3801)

at android.app.ActivityThread .access $ 1400 (ActivityThread.java:157)

в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1405) в android.os.Handler.dispatchMessage (Handler.java:102) на андроид .os.Looper.loop (Looper.java:148)

на android.app.ActivityThread.main (ActivityThread.java:5551) на java.lang.reflect.Method.invoke (Родной метод)

at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:730)

at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620)

Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean java.io.File.exists()' на нулевой ссылки на объект

в com.camera.MainActivity.onActivityResult (MainActivity.java:43)

в android.app.Activity.dispatchActivityResult (Activity.java:6463)

на андроид. app.ActivityThread.deliverResults (ActivityThread.java:3754)

в android.app.ActivityThread.handleSendResult (ActivityThread.java:3801)

в android.app.ActivityThread.access $ 1400 (ActivityThread.java:157)

в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1405)

на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:148)

на андроид. app.ActivityThread.main (ActivityThread.java:5551) at jav a.lang.reflect.Method.invoke (собственный метод)

at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:730)

на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:620)

Я не могу понять, почему это происходит. Кто-нибудь знает, как мне исправить ошибку? Благодаря!

ответ

1

Действие воссоздается, когда пользователь переходит из действия нажатия камеры на действие.

Таким образом, вам нужно сохранить путь к файлу в Bundle в onSaveInstanceState() (убедитесь, что для вызова super.onSaveInstanceState(outState);после вызывающего putString на outStateBundle), и создать файл снова в onRestoreInstanceState().

+0

Я только начал программировать на Android и не совсем уверен, как использовать функции, представленные в вашем решении, в моем приложении. Как написать код, который вы предложили? Благодаря! – user292965

+0

В принципе, когда вы переходите от Activity, активность может быть уничтожена. И затем, когда вы переходите к нему, он воссоздается. Теперь, что происходит в вашем вопросе, заключается в том, что ваш объект «Файл» сбрасывается при восстановлении Activity. Таким образом, чтобы восстановить прежнее состояние, вы сохраняете идентифицированный файл (то есть путь к файлу) в 'Bundle', переопределяя' onSaveInstanceState() ', а затем создаете новый экземпляр' File' путем переопределения 'onRestoreInstanceState()'. Объект 'Bundle' имеет такие методы, как' putString', 'putInt' и т. Д. – Daksh

0

Пожалуйста, проверьте, если у вас есть соответствующие права доступа, настроенных в приложения AndroidManifest.xml
(READ_EXTERNAL_STORAGE и/или WRITE_EXTERNAL_STORAGE)

+0

У меня есть оба его внутри файла AndroidManifest.xml. – user292965

0

Вы могли бы попытаться получить изображения URI из Intent параметра:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 0) { 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        imageFile = new File(data.getData().toString()); 
        if (imageFile.exists()) 
        { 
+0

Я попробовал ваше предложение. У меня все еще такая же проблема. Знаете ли вы по-другому? Благодаря! – user292965

0

Единственное, что я могу придумать, это то, что у вас есть две переменные imageFile, которые вы определяете и отправляете в намерении, и другую глобальную переменную imageFile, которая всегда равна нулю.

Этот код работает отлично:

public class CameraIntentActivity extends AppCompatActivity { 

    private File imageFile; 

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

     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

     imageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "abc.jpg"); 

     Uri store= Uri.fromFile(imageFile); 
     intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, store); 
     intent.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 0); 
     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == 0) { 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        if (imageFile.exists()) 
        { 
         Toast.makeText(this, "The file was saved at " + imageFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); 
        } 
        else 
        { 
         Toast.makeText(this, "Error saving the file ", Toast.LENGTH_LONG).show(); 
        } 
        break; 
       case Activity.RESULT_CANCELED: 
        break; 
       default: 
        break; 
      } 
     } 
    } 
Смежные вопросы