Передача изображения из кода ios / c ++ в JNI Android - PullRequest
3 голосов
/ 20 мая 2019

Я хочу предоставить пользователю функцию сохранения скриншота текущего экрана.Я использую cocos2d-x v3.0 и c ++ и впервые реализую эту функцию.Я немного погуглил и нашел этот кусок кода

Этот код отлично работает для хранения изображений на фотографиях ios

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent: 
                  [NSString stringWithUTF8String: filename] ];
UIImage* image = [UIImage imageWithContentsOfFile:path];

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

Я думаю, что байтовый массив может разрешитьсямоя проблема, но я не знаю, как передать это изображение на Android с помощью метода jni / байтового массива

Еще немного кода

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

std::string str =  CCFileUtils::sharedFileUtils()->getWritablePath();
str.append("/imageNameToSave.png");
const char * c = str.c_str();
tex->saveToFile(c);

this->scheduleOnce(schedule_selector(Dressup_screen_BG_button_view::Photo_Save_Gallery_Android),1.0);

#else

tex->saveToFile("imageNameToSave.png", kCCImageFormatPNG);
 this->scheduleOnce(schedule_selector(Dressup_screen_BG_button_view::Photo_Save_Gallery),1.0);
#endif


// This is native method which will save photo 
-( void )ThisPhotoClick{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *yourArtPath = [documentsDirectory stringByAppendingPathComponent:@"/imageNameToSave.png"];

UIImage *image = [UIImage imageWithContentsOfFile:yourArtPath];

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert !" message:@"Photo Saved To Photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];}

Метод Android

public  static void SaveImageAndroidJNI(final boolean visible)
{

    ContextWrapper c = new ContextWrapper(me);
    String path = c.getFilesDir().getPath() + "/imageNameToSave.png";
    System.out.println("Paht to check --"+path);
    File imgFile = new File(path);

    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    ArrayList<Uri> uris = new ArrayList<Uri>();
    uris.add(Uri.parse(path));

    OutputStream output;
    // Find the SD Card path



    File filepath = Environment.getExternalStorageDirectory();

    // Create a new folder in SD Card
    File dir = new File(filepath.getAbsolutePath()
            + "/Your Folder Name/");
    dir.mkdirs();

    // Create a name for the saved image
    File file = new File(dir, "imageNameToSave.png");

    try {

        output = new FileOutputStream(file);

        // Compress into png format image from 0% - 100%
        myBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.flush();
        output.close();
    }

    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    Intent intent = new Intent();
    Uri pngUri = Uri.fromFile(file);


    intent.setAction(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_STREAM, pngUri);
    intent.setType("image/jpeg");

    me.startActivity(Intent.createChooser(intent, "Share Image"));
}

Примечание

getWritablePath ();Теперь не работает из-за проблем с правами во время выполнения, я уже пытаюсь запросить разрешение при запуске приложения для Android, но все еще не работает, поэтому не предлагайте мне сделать это

Я хочу сохранитьзахваченное изображение на моем устройстве Android, но я не могу найти способ

Моя реализация является ссылкой на этот вопрос, но она не работает

Отладка

enter image description here

Возвращает null как растровое изображение. Я пытался несколькими способами декодировать растровое изображение. Когда я кладу его в блок try, он показывает мне openСбой: ENOENT (нет такого файла или каталога)

Я наблюдаю, что нет png в data / data / package, поэтому я сказал, что путь getWritable не работает для android

Вот мой разговор с евангелистом сообщества Cocos

Любая помощь, весьма значимая

1 Ответ

1 голос
/ 11 июля 2019

Для стороны Android:

Я не вижу никакого кода манифеста, но это требуется для создания пути. Поместите под тег <application> перед </application>:

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.cognizant.expressprescriptionregistration.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

Кроме того, если вы используете Android SDK 29, добавьте это в свой манифест и в теге <application

android:requestLegacyExternalStorage="true"

Под папкой res> layout> xml добавить "file_paths.xml"

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="any text you want here"
        path="Pictures/"/>
</paths>

И код Java для установки места хранения изображения

// Create the file where the photo will be stored
    private File createPhotoFile() {

        // Name of file
        String name = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

        // Location of storage
        File storedDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File photo = null;

        try {

            // Creates file in storedDir
            photo = File.createTempFile(name, ".jpg", storedDir);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return photo;
    }
...