Android Play Зашифрованное видео с libmedia: java.io.FileNotFoundException: Нет поставщика контента:

android video encryption

1529 просмотра

3 ответа

757 Репутация автора

У меня есть базовое приложение, которое может воспроизводить зашифрованное видео с помощью libmedia lib.

Метод шифрования видео работает правильно.

Но при воспроизведении видео показывает это сообщение об ошибке

путь равен null setDataSource IOException happend: java.io.FileNotFoundException: нет поставщика содержимого: http://127.0.0.1:36316/http://127.0.0.1:36316/storage/emulated/0/AB/b.mp4

Вот мой метод шифрования

    public static void encrypt() throws Exception {
    final byte[] buf = new byte[8192];
    final Cipher c = Cipher.getInstance("AES/CTR/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("1234567890123456".getBytes(), "AES"), new IvParameterSpec(new byte[16]));
    final InputStream is = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/"+"a.mp4");
    final OutputStream os = new CipherOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/"+"b.mp4"), c);
    while (true) {
        int n = is.read(buf);
        if (n == -1) break;
        os.write(buf, 0, n);
    }
    os.close(); is.close();
}

Вот моя кнопка воспроизведения

PlayBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/b.mp4");

           try {
              mServer = new LocalSingleHttpServer();
            } catch (IOException e) {
               e.printStackTrace();
           }

           String path = mServer.getURL(file.getPath());

            try {
                mServer.setCipher(myGetCipher());
                mServer.start();
                path = mServer.getURL(path);
                videoView.setVideoPath(path);
                videoView.start();
            }catch (Exception e){
             e.printStackTrace();
            }



        }
    });

Метод GetCyper ()

 private Cipher myGetCipher() throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException {
    // avoid the default security provider "AndroidOpenSSL" in Android 4.3+ (http://libeasy.alwaysdata.net/network/#provider)
    Cipher c = Cipher.getInstance("ARC4", "BC");
    c.init(Cipher.DECRYPT_MODE, new SecretKeySpec("BrianIsInTheKitchen".getBytes(), "ARC4"));
    return c;
}

Составлено с

compileSdkVersion 23
buildToolsVersion "23.0.3"

Сообщение об ошибке

setDataSource IOException happend : 
                                java.io.FileNotFoundException: No content provider: http://127.0.0.1:40208/storage/emulated/0/AB/b.mp4
                                at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1053)
                                at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907)
                                at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834)
                                at android.media.MediaPlayer.setDataSource(MediaPlayer.java:979)
                                at android.widget.VideoView.openVideo(VideoView.java:338)
                                at android.widget.VideoView.setVideoURI(VideoView.java:248)
                                at android.widget.VideoView.setVideoURI(VideoView.java:238)
                                at android.widget.VideoView.setVideoPath(VideoView.java:234)
                                at encrypt.amg.com.encryptiont2.MainActivity$2$override.onClick(MainActivity.java:89)
Автор: san88 Источник Размещён: 19.07.2016 06:19

Ответы (3)


2 плюса

48 Репутация автора

Вы вызываете getURL дважды.

String path = mServer.getURL (file.getPath ());

путь = mServer.getURL (путь);

Автор: sky Размещён: 19.07.2016 07:08

2 плюса

365 Репутация автора

Ответ неба верен: в любом случае исправление двойного вызова getURL () обязательно.

После этого запись в журнале java.io.FileNotFoundException: No content provider:все еще нормальная. Обратите внимание, что уровень сообщения не Ошибка, а Отладка. Именно так действует компонент проигрывателя Android: каким бы ни был путь к содержимому, он сначала пробует его как локальный ресурс, а в случае сбоя он возвращается к удаленному ресурсу. Вы видите , что на следующем сообщении отладки: Couldn't open file on client side, trying server side. На данный момент, библиотека поражена.

Если видео не воспроизводится, в другом месте что-то не так. Например, в ваших примерах кода шифр отличается между шифрованием и дешифрованием (AES / ARC4).

Автор: libeasy Размещён: 21.07.2016 01:26

0 плюса

1 Репутация автора

Вероятно, вам также нужно установить IVParameters в конце расшифровки, как вы это сделали в конце шифрования при инициализации Cipher.

c.init (Cipher.DECRYPT_MODE, новый SecretKeySpec ("BrianIsInTheKitchen" .getBytes (), "ARC4"), новый IVParameterSpec (новый байт [16]));

Автор: Kumar Gaurav Размещён: 08.09.2019 10:21
Вопросы из категории :
32x32