0

デバイス ギャラリーからサーバーに画像をアップロードする Android アプリを開発しました。Galaxy S3以外の他のデバイスでは問題なく動作します。S2 と S3 は同じ OS Jelly Bean を使用していますが、私の Galaxy S2 は正常に動作します。

S3 で画像のアップロード中にアプリがクラッシュします。何が悪いのかわからない?画像をアップロードするコードは次のとおりです。

if (selectedImagePath.length() != 0) {

            // get data from page

            try
            {

                BitmapFactory.Options opts=new BitmapFactory.Options();
                opts.inSampleSize = 4;  

                Bitmap bitmapOrg = BitmapFactory.decodeFile(selectedImagePath,opts);

                System.gc();

                ByteArrayOutputStream bao = new ByteArrayOutputStream();


                // Resize the image
                double width = bitmapOrg.getWidth();
                double height = bitmapOrg.getHeight();
                double ratio = 300 / width;
                int newheight = (int) (ratio * height);

                // System.out.println("———-width" + width);
                // System.out.println("———-height" + height);

                bitmapOrg = Bitmap.createScaledBitmap(bitmapOrg,400,
                        newheight, true);  // 400 chilo age

                // Here you can define .PNG as well
                bitmapOrg.compress(Bitmap.CompressFormat.JPEG,75, bao);

                byte[] ba = bao.toByteArray();
                String ba1 = ImageConverter.encodeBytes(ba);

                // System.out.println("uploading image now ——–” + ba1);

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("image", ba1));

                nameValuePairs.add(new BasicNameValuePair("event_id",
                        Integer.toString(taskEntity.getEventId())));
                nameValuePairs.add(new BasicNameValuePair("title", title));
                nameValuePairs.add(new BasicNameValuePair("description",
                        description));
                nameValuePairs.add(new BasicNameValuePair("urgent", Integer
                        .toString(urgentAttention)));
                nameValuePairs.add(new BasicNameValuePair("sendtime",
                        convertedtime));

                try {

                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(
                            AppSettings.SERVER_ADDRESS+"upload_image.php");
                    httppost.setEntity(new UrlEncodedFormEntity(
                            nameValuePairs));

                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();

                    // print responce
                    outPut = EntityUtils.toString(entity);
                    Log.i("GET RESPONSE—-", outPut);

                    // is = entity.getContent();
                    Log.e("log_tag ******", "good connection");

                    bitmapOrg.recycle();


                } catch (Exception e) {
                    Log.e("log_tag ******",
                            "Error in http connection " + e.toString());
                }

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

        }
4

1 に答える 1

1

受け取ったエラーを示していませんでしたが、問題はGalaxy S3に固有のものであるため、OutOfMemoryErrorだと思います。S3 は、画面サイズに比べてアプリ ヒープが小さい傾向があるため、ビットマップ ストレージは少しきついです。

使用してみてください:

opts.inPurgeable = true;
opts.inInputShareable = true;

inPurgeable はビットマップを別のヒープに割り当て、ガベージ コレクターを待たずにメモリ不足の状態でそのデータを破棄できるようにします。inInputShareable を使用すると、指定された入力からビットマップを再デコードできるようになり、処理が完了する前にビットマップが消去された場合に備えます。これら 2 つのオプションをできるだけ頻繁に使用することをお勧めします。inInputShareable を使用すると、ビットマップが再度必要になる可能性があるため、デコードされるデータを変更または破棄できないことに注意してください。

于 2013-03-20T18:55:29.997 に答える