Почему не удалось сохранить растровое изображение во внешнем хранилище, даже если растровое изображение создано правильно и может отображаться в imageView? - PullRequest
0 голосов
/ 01 декабря 2018

Я могу успешно запустить намерение, используя общий экран (растровое изображение) из местоположения файла "file: ///sdcard/teilitary_file.jpg".Но теперь я застрял при сохранении растрового изображения в этом месте.

Я включил следующее в манифесты

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Также эта функция для проверки разрешения:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // do your stuff
            } else {
                Toast.makeText(iv_ScoreBoard.this, "GET_ACCOUNTS Denied",
                        Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions,
                    grantResults);
    }
}

Кнопка общего доступа по клику:

    View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
    Bitmap bitmaptest = getScreenShot(rootView);

    Intent share = new Intent(Intent.ACTION_SEND);
    share.putExtra(Intent.EXTRA_TEXT, "@Share from App \"XXYY\"");
    share.setType("image/jpeg");
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmaptest.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
            try {
                f.createNewFile();
                FileOutputStream fo = new FileOutputStream(f);
                fo.write(bytes.toByteArray());
            } catch (IOException e) {
                e.printStackTrace();
            }
            share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/temporary_file.jpg"));
            startActivity(Intent.createChooser(share, "Share Image"));

            return true;

getScreenShot (просмотр в режиме просмотра)

public static Bitmap getScreenShot(View view) {
    View screenView = view.getRootView();
    screenView.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
    screenView.setDrawingCacheEnabled(false);
    return bitmap;
}

При нажатии кнопки «Поделиться» выдается черная экранная кепка в виде картинки ... Файл не создан, нетошибка найдена.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

При совместном использовании файла с другим приложением вам необходимо предоставить разрешения Uri.

Для этого вам сначала нужно создать провайдера в вашем Manifest, например:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

@xml/provider_paths будет выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="SavedImages" path="Android/data/com.yourpackagename.yourappname/files/SavedImages/"/>
</paths>

Вы должны будете создать вышеупомянутое в вашей папке res -> xml, которую я назвал моей provider_paths.xml

Если у вас нет папки xml, создайте ее.


, тогда, когда вы поделитесь своим файлом, вы должны предоставить разрешения:

Uri imageUri;
Intent share = new Intent(Intent.ACTION_SEND);
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    imageUri = Uri.parse("file:///sdcard/temporary_file.jpg");
}else {
    File newFile = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
    imageUri = FileProvider.getUriForFile(getContext(), getContext().getPackageName() + ".provider", newFile);
    share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
share.setType("image/jpeg");
share.putExtra(Intent.EXTRA_STREAM, imageUri);
share(Intent.createChooser(share, "Share image using"));

Честно говоряне думайте, что ваша проблема связана с разрешениями во время выполнения. Если это так, вы получите сбой, и файл не будет создан.Как вы указали в своем вопросе It produces a black screen cap as a picture when share button is clicked... No file is created, no error is found..

Если не предоставить разрешения Uri, другая рука, скорее всего, выдаст исключение Uri.

Файл все равно будет создан,но это было бы пусто.Как вы испытываете.

0 голосов
/ 01 декабря 2018

Вы не запрашиваете / не проверяете разрешения, по крайней мере, в коде, предоставленном вами в вопросе.

В вашем коде реализован только onRequestPermissionResult, который вызывается, чтобы уведомить вас о результатах, как только вы запросили разрешения.

Вы должны запросить разрешение.

Выполните следующие действия в своей деятельности.

 final int requestCode1 = 100;//this is the constant which you pass while requesting permission.
 // this code helps you to identify which permission was requested in onPermissionResultReceived, in case you are dealing with more than one permission groups. 
 ....
 onCreate(){
 ... // your code goes here
 ...
 @Override
 public void onClick(View view){
 if (ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
    // request permission    
     ActivityCompat.requestPermissions(iv_ScoreBoard.this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode1);
 } else{
    //permission granted
    takeScreenShot();
 }

Ваш onRequestPermissionsResult

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
    case requestCode1:
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // do your stuff
             takeScreenShot();
        } else {
            Toast.makeText(iv_ScoreBoard.this, "Permission Denied",
                    Toast.LENGTH_SHORT).show();
        }
        break;
    default:
        super.onRequestPermissionsResult(requestCode, permissions,
                grantResults);
   }
}

Добавьте приведенный выше код в onCreate или непосредственно перед выполнением действия, котороетребуется это разрешение.

См. - https://developer.android.com/training/permissions/requesting#java

...