Note that there are some explanatory texts on larger screens.

plurals
  1. POApps Crash when I change the orientation
    primarykey
    data
    text
    <p>Actually I am new on android and I am making a small android app for me to capture a photo and upload it to a web server, I've found some example code to do it. </p> <p>The problem is that it works great on both landscape or portrait when I start the apps, but if I change the orientation from landscape to portrait or from portrait to landscape, it crashed.</p> <p>Here is the log by Eclipse:</p> <pre><code>04-26 13:04:36.380: I/dalvikvm(887): threadid=3: reacting to signal 3 04-26 13:04:36.510: I/dalvikvm(887): Wrote stack traces to '/data/anr/traces.txt' 04-26 13:04:36.880: I/dalvikvm(887): threadid=3: reacting to signal 3 04-26 13:04:36.890: I/dalvikvm(887): Wrote stack traces to '/data/anr/traces.txt' 04-26 13:04:37.180: D/gralloc_goldfish(887): Emulator without GPU emulation detected. 04-26 13:04:37.390: I/dalvikvm(887): threadid=3: reacting to signal 3 04-26 13:04:37.530: I/dalvikvm(887): Wrote stack traces to '/data/anr/traces.txt' 04-26 13:07:26.370: D/HEE(887): /mnt/sdcard/neosoft/ocr/photo/IMG_20130426_130726.jpg 04-26 13:07:27.840: D/dalvikvm(887): GC_FOR_ALLOC freed 128K, 3% free 9168K/9415K, paused 404ms 04-26 13:07:44.929: D/AndroidRuntime(887): Shutting down VM 04-26 13:07:44.929: W/dalvikvm(887): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 04-26 13:07:44.990: E/AndroidRuntime(887): FATAL EXCEPTION: main 04-26 13:07:44.990: E/AndroidRuntime(887): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.atakephoto1/com.example.atakephoto1.Photo1Activity}: java.lang.NullPointerException 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3351) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.access$700(ActivityThread.java:123) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.os.Handler.dispatchMessage(Handler.java:99) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.os.Looper.loop(Looper.java:137) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.main(ActivityThread.java:4424) 04-26 13:07:44.990: E/AndroidRuntime(887): at java.lang.reflect.Method.invokeNative(Native Method) 04-26 13:07:44.990: E/AndroidRuntime(887): at java.lang.reflect.Method.invoke(Method.java:511) 04-26 13:07:44.990: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 04-26 13:07:44.990: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 04-26 13:07:44.990: E/AndroidRuntime(887): at dalvik.system.NativeStart.main(Native Method) 04-26 13:07:44.990: E/AndroidRuntime(887): Caused by: java.lang.NullPointerException 04-26 13:07:44.990: E/AndroidRuntime(887): at com.example.atakephoto1.Photo1Activity.onCreate(Photo1Activity.java:139) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.Activity.performCreate(Activity.java:4465) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 04-26 13:07:44.990: E/AndroidRuntime(887): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 04-26 13:07:44.990: E/AndroidRuntime(887): ... 12 more 04-26 13:07:45.751: I/dalvikvm(887): threadid=3: reacting to signal 3 04-26 13:07:45.760: I/dalvikvm(887): Wrote stack traces to '/data/anr/traces.txt' </code></pre> <p>Here is my java code:</p> <pre><code>package com.example.atakephoto1; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.ImageFormat; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.Parameters; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.Size; import android.util.Log; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.FrameLayout; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class Photo1Activity extends Activity { //private AutoFocusCallback myAutoFocusCallback = null; public static String image_file_path; public static String php_upload_url; public static String photoPath; String TAG="tag"; private Camera mCamera; private CameraPreview mPreview; public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_VIDEO = 2; SQLiteDatabase db; public String db_name = "config"; public String table_name = "config"; NewListDataSQL helper = new NewListDataSQL(Photo1Activity.this, db_name); AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { } }; public static boolean exists(String URLName){ try { HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection(); con.setRequestMethod("HEAD"); return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { e.printStackTrace(); return false; } } protected void alertbox(String title, String mymessage) { new AlertDialog.Builder(this) .setMessage(mymessage) .setTitle(title) .setCancelable(true) .setNeutralButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton){} }) .show(); } public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // some work that needs to be done on orientation change } @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo1); db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select value from config where name='image_save_path'", null); int rows_num = cursor.getCount(); if(rows_num != 0) { cursor.moveToFirst(); for(int i=0; i&lt;rows_num; i++) { String strCr = cursor.getString(0); photoPath = strCr; cursor.moveToNext(); } } cursor.close(); Cursor cursor_php = db.rawQuery("select value from config where name='php_upload_url'", null); int rows_num_php = cursor_php.getCount(); if(rows_num_php != 0) { cursor_php.moveToFirst(); for(int i=0; i&lt;rows_num_php; i++) { String strCr = cursor_php.getString(0); php_upload_url = strCr; cursor_php.moveToNext(); } } cursor_php.close(); // Create an instance of Camera mCamera = getCameraInstance(); //final Camera.Parameters parameters = mCamera.getParameters(); Parameters parameters = mCamera.getParameters(); List&lt;Size&gt; sizes = parameters.getSupportedPictureSizes(); Camera.Size size = sizes.get(0); for(int i=0;i&lt;sizes.size();i++) { if(sizes.get(i).width &gt; size.width) size = sizes.get(i); } parameters.setPictureSize(size.width, size.height); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); parameters.setSceneMode(Parameters.SCENE_MODE_AUTO); parameters.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO); parameters.setExposureCompensation(0); parameters.setPictureFormat(ImageFormat.JPEG); parameters.setJpegQuality(100); List&lt;String&gt; focusModes = parameters.getSupportedFocusModes(); if (focusModes.contains(Parameters.FOCUS_MODE_AUTO)){ parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO); } mCamera.setParameters(parameters); // Create our Preview view and set it as the content of our activity. mPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); final FrameLayout frame01 = (FrameLayout) findViewById(R.id.camera_preview); frame01.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mCamera.autoFocus(myAutoFocusCallback); } }); // Add a listener to the Capture button final Button captureButton = (Button) findViewById(R.id.button_capture); captureButton.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { // get an image from the camera captureButton.setEnabled(false); mCamera.autoFocus(myAutoFocusCallback); mCamera.takePicture(null, null, mPicture); } } ); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_photo1, menu); return true; } private boolean checkCameraHardware(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ // this device has a camera return true; } else { // no camera on this device return false; } } /** A safe way to get an instance of the Camera object. */ public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); // attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable } /** A basic Camera preview class */ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, now tell the camera where to draw the preview. } public void surfaceDestroyed(SurfaceHolder holder) { // empty. Take care of releasing the Camera preview in your activity. } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null){ // preview surface does not exist return; } // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview } // set preview size and make any resize, rotate or // reformatting changes here // start preview with new settings try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e){ Log.d(TAG, "Error starting camera preview: " + e.getMessage()); } } } private PictureCallback mPicture = new PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); if (pictureFile == null){ Log.d(TAG, "Error creating media file, check storage permissions: "); //e.getMessage()); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); image_file_path = pictureFile.getPath(); Log.d("HEE",pictureFile.getPath()); FileUploadTask fileuploadtask = new FileUploadTask(); fileuploadtask.execute(); mCamera.startPreview(); final Button captureButton = (Button) findViewById(R.id.button_capture); captureButton.setEnabled(true); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { Log.d(TAG, "Error accessing file: " + e.getMessage()); } } }; /** Create a file Uri for saving an image or video */ private static Uri getOutputMediaFileUri(int type){ return Uri.fromFile(getOutputMediaFile(type)); } /** Create a File for saving an image or video */ private static File getOutputMediaFile(int type){ // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. String filepath = Environment.getExternalStorageDirectory().getPath(); File mediaStorageDir = new File(filepath, photoPath ); if(!mediaStorageDir.exists()){ Log.d("HERE",photoPath ); try { mediaStorageDir.mkdirs(); Log.d("HERE","after"); } catch (Exception e) { Log.d("HERE",e.getMessage().toString()); } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if (type == MEDIA_TYPE_IMAGE){ mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg"); } else if(type == MEDIA_TYPE_VIDEO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_"+ timeStamp + ".mp4"); } else { return null; } return mediaFile; } class FileUploadTask extends AsyncTask&lt;Object, Integer, Void&gt; { private ProgressDialog dialog = null; HttpURLConnection connection = null; DataOutputStream outputStream = null; DataInputStream inputStream = null; String pathToOurFile = image_file_path; String urlServer = php_upload_url; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; File uploadFile = new File(pathToOurFile); long totalSize = uploadFile.length(); // Get size of file, bytes @Override protected void onPreExecute() { dialog = new ProgressDialog(Photo1Activity.this); dialog.setMessage("Uploading..."); dialog.setIndeterminate(false); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setProgress(0); dialog.show(); } @Override protected Void doInBackground(Object... arg0) { long length = 0; int progress; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 256 * 1024; try { FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile)); URL url = new URL(urlServer); connection = (HttpURLConnection) url.openConnection(); // Set size of every block for post connection.setChunkedStreamingMode(256 * 1024);// 256KB // Allow Inputs &amp; Outputs connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); // Enable POST method connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); outputStream = new DataOutputStream( connection.getOutputStream()); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile + "\"" + lineEnd); outputStream.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // Read file bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead &gt; 0) { outputStream.write(buffer, 0, bufferSize); length += bufferSize; progress = (int) ((length * 100) / totalSize); publishProgress(progress); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); publishProgress(100); // Responses from the server (code and message) // int serverResponseCode = connection.getResponseCode(); // String serverResponseMessage = connection.getResponseMessage(); fileInputStream.close(); outputStream.flush(); outputStream.close(); } catch (Exception ex) { } return null; } @Override protected void onProgressUpdate(Integer... progress) { dialog.setProgress(progress[0]); } @Override protected void onPostExecute(Void result) { try { dialog.dismiss(); // TODO Auto-generated method stub } catch (Exception e) { } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload