Pergunta

Iam usar cordova 3.4.Quando eu capturar uma imagem e defini-lo,seu trabalho bem, mas quando eu tento acessar imagem da galeria de eu obter o url

content://com.android.providers.media.documents/document/image%4A463

e eu fico imagem carregar erro na minha imagem de marca.Eu sei que este é um bug aí e eu tenho chamado de pilha de perguntas, tais como Não é possível carregar a imagem quando selecionada a partir da galeria do Android 4.4 (KitKat) usando o PhoneGap Câmara Plugin

Eu não posso usar a trabalho áspero em torno mencionado, onde a URI é definida manualmente como conteúdo://media/externo/images/media/ porque nós foco dispositivos internos construído em armazenamento, tais como Moto

Também você pode por favor confirmar que este problema foi corrigido no cordova 3.5.Porque eu precisar de uma permissão de meus funcionários para download e o que eu deve certificar-se que ele seja realizável .Alguém pode ajudar por favor

ATUALIZAÇÃO:

app.directive('upload', function() {
return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
        elm.on('click', function() {
            navigator.camera.getPicture(
                    function(imageURI) {
                        scope.$apply(function() {
                            alert(imageURI);
                               ctrl.$setViewValue(imageURI);
                        });
                        window.resolveLocalFileSystemURI(imageURI, function(fileEntry)                                                                       {
                             //                                                   ctrl.$setViewValue(imageURI);
                            alert("inside local file" + imageURI);
                            alert("Inside local file system");
                            fileEntry.file(function(fileObj) {
                                alert("hai");
                                var options = new FileUploadOptions();
                                options.fileKey = "file";
                                options.fileName = fileObj.name;
                                options.mimeType = fileObj.type;
                                var ft = new FileTransfer();
                                // var url = fileUploadUrl;
                                // ft.upload(imageUri, encodeURI(url), success,                 failure, options);
                            });
                        });
                    },
                    function(err) {
                        ctrl.$setValidity('error', false);
                    }, {quality: 50,
                destinationType: Camera.DestinationType.FILE_URI,
                  sourceType: Camera.PictureSourceType.PHOTOLIBRARY
            }
            );
        });
    }
};
       });

Meu HTML:

  <img
                    ng-src="{{onepic}}" 
                    width="250" 
                    height="390" 
                    alt="error"/>

Eu definir o valor para onepic no meu controlador dentro da função de relógio.Então, quando directiva retorna um URI será automaticamente definido em onepic.Por favor, especifique qualquer solução alternativa ou se Iam fazendo nada de errado ,Iam de novo para angularjs

Foi útil?

Solução

Tente isso..

Na Câmara Plugin não é um FileHelper.java Arquivo, Substitua o plugin getRealPath com o meu presente o meu método.

Para mais detalhes você pode seguir este -> https://issues.apache.org/jira/browse/CB-5398

FileHelper.java

    @SuppressWarnings("deprecation")
    public static String getRealPath(String uriString, CordovaInterface cordova) {
        String realPath = null;


        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat) {
        Cursor cursor =  cordova.getActivity().getContentResolver().query(Uri.parse(uriString), null, null, null, null);
        cursor.moveToFirst();
        String document_id = cursor.getString(0);
        document_id = document_id.substring(document_id.lastIndexOf(":")+1);
        cursor.close();

        cursor = cordova.getActivity().getContentResolver().query( 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
        cursor.moveToFirst();
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        realPath = path;
        cursor.close();
        }else{

        if (uriString.startsWith("content://")) {
            String[] proj = { _DATA };
            Cursor cursor = cordova.getActivity().managedQuery(Uri.parse(uriString), proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(_DATA);
            cursor.moveToFirst();
            realPath = cursor.getString(column_index);
            if (realPath == null) {
                LOG.e(LOG_TAG, "Could get real path for URI string %s", uriString);
            }
        } else if (uriString.startsWith("file://")) {
            realPath = uriString.substring(7);
            if (realPath.startsWith("/android_asset/")) {
                LOG.e(LOG_TAG, "Cannot get real path for URI string %s because it is a file:///android_asset/ URI.", uriString);
                realPath = null;
            }
        } else {
            realPath = uriString;
        }

        }
        return realPath;
    }

No CameraLauncher.java Classe therer é um método processResultFromGallery

private void processResultFromGallery

Encontrar este código:

    if (this.targetHeight == -1 && this.targetWidth == -1 &&
                (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation){

        this.callbackContext.success(uri.toString());
    }

E troque por isso:

    if (this.targetHeight == -1 && this.targetWidth == -1 &&
                (destType == FILE_URI || destType == NATIVE_URI) && !this.correctOrientation) {

            String s    =FileHelper.getRealPath(uri.toString(), cordova);
            Log.i("test","<<<<ifURI::::::"+s +"URI::::" + uri.toString());
            this.callbackContext.success(s);

     }  

Outras dicas

ver este resposta:

    if (imageUri.toString().substring(0,21).equals("content://com.android")) {
          String [] photo_split= imageUri.toString().split("%3A");
          String imageUriBasePath = "content://media/external/images/media/"+photo_split[1];
           imageUri= Uri.parse(imageUriBasePath );

        }

Sempre que algum uri é passado para <img src="uri" /> é implicitamente decodificada a partir de

conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem%3A9888 (1)

em

conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem:9888 (2)

No entanto, depois de voltar da Intent.ACTION_OPEN_DOCUMENT ou Intent.ACTION_GET_CONTENT O Android fornece-lhe a permissão de leitura para (1), não (2).Neste caso, WebView vai com expectativa de log de erro:

o java.lang.SecurityException:Negação De Permissão:leitura com.android.provedores.meios de comunicação.MediaDocumentsProvider uri conteúdo://com.android.provedores.meios de comunicação.documentos/documento/imagem:9888 a partir pid=13163, uid=10165 requer android.permissão.MANAGE_DOCUMENTS, ou grantUriPermission()

ou

Não é possível abrir o conteúdo de URL

Snippet de código

Tudo o que você precisa para resolver a questão é

    String uriToUseInWebView = transformForWebView(uri.toString());

    private String transformForWebView(String uri) {
        for (int i = 0; i < timesDecodingWebView(); i++)
            uri = uri.replace("%", Uri.encode("%"));
        return uri;
    }

    private int timesDecodingWebView() {
        if (Build.VERSION.RELEASE.equals("4.4.2")) {
            return 2;
        } else {
            return 1;
        }
    }

no seu código Java antes de passar uri em HTML/JS para garantir que (1) vai ser carregados.

Eu testei que em 4.4.2, 4.4.4 e 5.0.A parte engraçada é que o Android 4.4.2 decodifica o uri internamente, duas vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top