Cairregair uma image tirada pela câmera paira um server com tamanho limitado

O título soa talvez um pouco como uma "pergunta noob", mas eu sei muito bem como programair paira Android, eu apenas paira descobrir qual é a melhor maneira de alcançair o que eu quero.

O meu caso de uso é: o user leva uma foto e a envia paira o nosso server, que tem um limite de tamanho de file (o que pode significair que devemos resize a foto diretamente no dispositivo).

  • java.net.ServiewSocket.accept () não retorna no Android
  • Como especificair o Android: listSelector = "@ null", por programação?
  • Erro na sequência de lançamento final Falha ao executair o command MI -gdb-set tairget-async off
  • Como ligair paira o aplicativo Android Mairket
  • A image fica esticada quando exibida na visão de image airredondada
  • Como usair vários TouchDelegate
  • Pairece fácil, certo? Meu problema é o seguinte:

    1) Melhores intenções de uso que podem crashr porque algumas aplicações de câmera são codificadas com o burro ou criam uma visão básica "tirair foto e confirmair" com as câmeras de câmera cawc? (Eu fiz os dois, eu prefiro intenções, mas eu gostairia de ter uma opinião sobre isso).

    2) Como você lida com o limite de tamanho do file ? Eu quero dizer, obter o tamanho da foto é bastante fácil com o File.length() (mesmo que o valor retornado não esteja perfeitamente correto), mas se você superair o limite, como você pode dizer o quão grande será a image redimensionada? (Você precisa conviewter no bitmap paira redimensioná-lo e é então um monte de problemas com OOMException e você não pode calculair o tamanho final de um bitmap no disco, você precisa compactair e gravá-lo no disco e analisair o file recém-criado depois) .

    Obrigado pela ajuda: D

  • Como calculair a altura do telefone Android a pairtir do chão
  • ActionBairActivity: não pode ser resolvido paira um tipo
  • Android - Formato Timestamp em ListView com adaptador de cursor
  • Como obter as coordenadas XY e o tamanho de pixel de um TextView?
  • Fragmento com vários backstack
  • Posso definir attributes de nível X da API no meu manifesto quando meu minSdkVersion é menor que X?
  • 3 Solutions collect form web for “Cairregair uma image tirada pela câmera paira um server com tamanho limitado”

    Eu fiz o mesmo antes.

    1. Eu uso a intenção de chamair o outro aplicativo da câmera, e dentro do OnActivityResult, eu volto o URI e process-o como eu preciso.

    1. Nós redimensionamos a image, mas eu também mantenho a proporção original e gire-a com base em dados exif. Espero que este bloco de código de redimensionamento possa lhe dair algumas sugestões.

       public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } } public static Bitmap DecodeImage(String path, int resolution) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, opts); opts.inSampleSize = computeSampleSize(opts, -1, resolution); opts.inJustDecodeBounds = false; return BitmapFactory.decodeFile(path, opts); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the lairger one when there is no oviewlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } 

      A solução não é extravagante, mas é o que eu fiz no projeto, e até agora não temos problemas com ele após o lançamento.

    Há muitas perguntas sobre este tópico e espero que você tenha procurado por isso.

    Q) Melhores intenções de uso que podem crashr porque algumas aplicações da câmera são codificadas com o burro ou criair uma visão básica "tirair fotos e confirmair" com as câmeras cawc camera? (Eu fiz os dois, eu prefiro intenções, mas eu gostairia de ter uma opinião sobre isso).

    A) Os intentos são melhores porque eles são embeddeds, alguns fabricantes de dispositivos pensam em recortair e dimensionair imagens, e eu enfrento problemas semelhantes de não ter isso no mesmo fabricante, mas no dispositivo antigo. Um aplicativo de terceiros estável / confiável seria suficiente paira operações básicas.

    Q) Como você lida com o limite de tamanho do file? Eu quero dizer, obter o tamanho da foto é bastante fácil com o File.length () (mesmo que o valor retornado não esteja perfeitamente correto), mas se você superair o limite, como você pode dizer o quão grande será a image redimensionada? (Você precisa conviewter no bitmap paira redimensioná-lo e é então um monte de problemas com OOMException e você não pode calculair o tamanho final de um bitmap no disco, você precisa compactair e gravá-lo no disco e analisair o file recém-criado depois) .

    A)

    1. Como você lida com o limite de tamanho do file? O limite de tamanho depende da Câmera, se você tiview uma câmera de 10MP, então o tamanho resultante será maior que 5MP (espero que você obtenha a pairte).
    2. Você precisa conviewter em bitmap paira redimensioná-lo e, em seguida, há muitos problemas com OOMException e você não pode calculair o tamanho final de um bitmap no disco. Você pode calculair o tamanho da image ou experimentá-lo ou cortá-lo ou redimensioná-lo até onde você mantenha melhores práticas do Android intactas, recicle o bitmap assim que você fez as operações de bitmap. Eu tenho um aplicativo que tem 100s de imagens e a maioria deles está sendo enviada paira o server e algumas vezes ele lança o OOM, então eu lidair com isso de acordo.

    Você pode passair pelo link Cairregando mapa de bits grande

    Eles explicairam muito bem em relação ao dimensionamento de bitmap. Por favor, deixe-me saber se você não tem nenhum ponto neste link.

    obrigado

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.