Изображение Выберите для Android с помощью расширения Java в Game Maker Studio

Я пытаюсь сделать расширение Java для Android-приложения Game Maker Studio.

Я пытался использовать код из онлайн-учебников, но GMS использует другой подход, и я не могу заставить его работать.

Я использую код ниже:

package ${YYAndroidPackageName};

//Basic imports
import android.util.Log;
import java.lang.String;
import java.lang.String;

import android.app.Activity;
import android.content.Intent;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

//Import Game Maker classes
import ${YYAndroidPackageName}.R;
import com.yoyogames.runner.RunnerJNILib;
import ${YYAndroidPackageName}.RunnerActivity;

public class pickimage extends Activity {

    public static final int PICK_IMAGE = 1;
    private static final int EVENT_OTHER_SOCIAL = 70;

    public void selectimage() 
    {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
        int dsMapIndex = RunnerJNILib.jCreateDsMap(null, null, null);
        RunnerJNILib.DsMapAddString( dsMapIndex, "type", "pickeropened" );
        RunnerJNILib.DsMapAddDouble( dsMapIndex, "argument0", 2);
        RunnerJNILib.DsMapAddDouble( dsMapIndex, "argument0", 3);
        RunnerJNILib.CreateAsynEventWithDSMap(dsMapIndex, EVENT_OTHER_SOCIAL);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        URI selectedImageUri = null;
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                selectedImageUri = new URI(data.getData());
                //String selectedImagePath = getPath(selectedImageUri);
                //Log.i("yoyo", selectedImagePath);
                //return selectedImagePath;
    int dsMapIndex = RunnerJNILib.jCreateDsMap(null, null,null);
    RunnerJNILib.DsMapAddString( dsMapIndex, "type", "imagepath" );
    RunnerJNILib.DsMapAddString( dsMapIndex, "path", selectedImagePath);
    RunnerJNILib.DsMapAddString( dsMapIndex, "path", "boo");
    RunnerJNILib.CreateAsynEventWithDSMap(dsMapIndex, EVENT_OTHER_SOCIAL);
            }
        }
    }

    /**
     * helper to retrieve the path of an image URI

    public String getPath(Uri uri) {
            // just some safety built in 
            if( uri == null ) {
                // TODO perform some logging or show user feedback
                return null;
            }
            // try to retrieve the image from the media store first
            // this will only work for images selected from gallery
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            if( cursor != null ){
                int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            }
            // this is our fallback here
            return uri.getPath();
    }*/

}

Я следил за учебным пособием по расширению GMS, и оно не работает. Вот некоторые уведомления об ошибках из консоли:

:com.companyname.Test_Image_Chooser:compileReleaseJavaWithJavacF:\GM\Cache\Test_Image_Chooser\Android\Default\com.companyname.Test_Image_Chooser\src\main\java\com\companyname\Test_Image_Chooser\pickimage.java:41: error: cannot find symbol
            if (requestCode == SELECT_PICTURE) {
                               ^
  symbol:   variable SELECT_PICTURE
  location: class pickimage
F:\GM\Cache\Test_Image_Chooser\Android\Default\com.companyname.Test_Image_Chooser\src\main\java\com\companyname\Test_Image_Chooser\pickimage.java:42: error: incompatible types: Uri cannot be converted to String
                selectedImageUri = new URI(data.getData());
                                                       ^
F:\GM\Cache\Test_Image_Chooser\Android\Default\com.companyname.Test_Image_Chooser\src\main\java\com\companyname\Test_Image_Chooser\pickimage.java:48: error: cannot find symbol
    RunnerJNILib.DsMapAddString( dsMapIndex, "path", selectedImagePath);
                                                     ^
  symbol:   variable selectedImagePath
  location: class pickimage
Note: Some input files use or override a deprecated API.
* What went wrong:
Execution failed for task ':com.companyname.Test_Image_Chooser:compileReleaseJavaWithJavac'.

Что я хочу реализовать, так это то, что пользователь нажимает кнопку в приложении, он открывает диалоговое окно Native Image Picker, пользователь выбирает файл. Затем пользователь нажимает другую кнопку, и приложение получает полный путь к выбранному изображению, а затем я загружаю его на свой сервер.

Я новичок в Java :)

Кто-нибудь может помочь?


person user2899094    schedule 22.08.2016    source источник


Ответы (1)


Я вижу некоторые проблемы в вашем java-файле: при использовании намерений вы должны уведомить jnirunner о том, что вы активируете намерение, а также у вас есть лишний ненужный аргумент и другие дополнительные вещи, поэтому эта часть вашего кода

startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
int dsMapIndex = RunnerJNILib.jCreateDsMap(null, null, null);
    RunnerJNILib.DsMapAddString( dsMapIndex, "type", "pickeropened" );
    RunnerJNILib.DsMapAddDouble( dsMapIndex, "argument0", 2);
    RunnerJNILib.DsMapAddDouble( dsMapIndex, "argument0", 3);
    RunnerJNILib.CreateAsynEventWithDSMap(dsMapIndex, EVENT_OTHER_SOCIAL);

должен просто выглядеть примерно так и иметь оператор соединителя перед ним, чтобы уведомить бегуна, и не вызывать асинхронное событие в это время:

RunnerActivity.CurrentActivity.startActivityForResult(intent, PICK_IMAGE);

Итак, в вашем коде onActivityResult вы закомментировали важную часть кода, поэтому асинхронное событие не получает необходимой информации, и там есть некоторые дополнительные вещи и строка кода «путь», которую вы указали дважды с другим выводом переменные, поэтому

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    URI selectedImageUri = null;
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            selectedImageUri = new URI(data.getData());
            //String selectedImagePath = getPath(selectedImageUri);
            //Log.i("yoyo", selectedImagePath);
            //return selectedImagePath;
            int dsMapIndex = RunnerJNILib.jCreateDsMap(null, null,null);
            RunnerJNILib.DsMapAddString( dsMapIndex, "type", "imagepath" );
            RunnerJNILib.DsMapAddString( dsMapIndex, "path", selectedImagePath);
            RunnerJNILib.DsMapAddString( dsMapIndex, "path", "boo");
            RunnerJNILib.CreateAsynEventWithDSMap(dsMapIndex, EVENT_OTHER_SOCIAL);
        }
    }
}

должен стать этим

public void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(int requestCode, int resultCode, Intent data)
    if (resultCode == RESULT_OK) {
        if (requestCode == PICK_IMAGE) {
            String path = data.getData().toString());
            Log.i("yoyo", path);
            int dsMapIndex = RunnerJNILib.jCreateDsMap(null, null,null);
            RunnerJNILib.DsMapAddString( dsMapIndex, "type", "imagepath" );
            RunnerJNILib.DsMapAddString(result, "selectedImageUri", path);
            RunnerJNILib.CreateAsynEventWithDSMap(dsMapIndex, EVENT_OTHER_SOCIAL);
        }
    }
}
person Wraithious    schedule 13.07.2017