Перейти к содержанию
  • 0
AlexShaman

Сделать фото через интент ACTION_Image_Capture

Вопросы

procedure TfMain.PhotoClick(Sender: TObject);
var sPath,FLastPhotoName:string;
  {$IF DEFINED(ANDROID)}
  PhotoIntent: JIntent;
  photoUri: Jnet_Uri;
  JFileName: JFile;
  {$ENDIF}
begin
  {$IF DEFINED(ANDROID)}
  FLastPhotoName := '';
  FLastPhotoFullName := '';

  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage);
  PhotoIntent := TJIntent.JavaClass.init(TJMediaStore.JavaClass.ACTION_IMAGE_CAPTURE);
  if (PhotoIntent.resolveActivity(TAndroidHelper.Context.getPackageManager()) <> nil) then
  begin
    FLastPhotoName := THashMD5.GetHashString('JPEG PHOTO FILE ' + DateTimeToStr(Now)) + '.jpg';
    FLastPhotoFullName := TPath.Combine(TPath.GetSharedDocumentsPath, FLastPhotoName);
    JFileName := TJFile.JavaClass.init(StringToJString(FLastPhotoFullName));
    photoUri := TJnet_Uri.JavaClass.fromFile(JFileName);
    PhotoIntent.putExtra(TJMediaStore.JavaClass.EXTRA_OUTPUT,
        TJParcelable.Wrap((photoUri as ILocalObject).GetObjectID));

    if PhotoIntent.resolveActivity(TAndroidHelper.Activity.getPackageManager) <> nil then
      TAndroidHelper.Activity.startActivityForResult(PhotoIntent, REQUEST_IMAGE_CAPTURE);

  end;
  {$ENDIF}

 

Приложение камеры открывается, фото делается, но при закрытии приложение вылетает

В логах ошибки

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.embarcadero.test/com.embarcadero.firemonkey.FMXNativeActivity}: java.lang.NullPointerException

 

Отредактировал AlexShaman

Поделиться сообщением


Ссылка на сообщение

Рекомендуемые сообщения

  • 0

Вы смотрели этот пример из папки Samples?

C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\AccessCameraApp\AccessCameraApp.dproj

Поделиться сообщением


Ссылка на сообщение
  • 0

Теперь не могу сохранить фото, т.е. оно вроде бы сохраняется, файл в папке появляется, но при открытии через стандарный(и не стандартный) Viewer ничего не открывается... "элемент не найден"..

Если из программы попытаться открыть-вылетает

 

procedure TfMain.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
var sPath:string;
  Image2: TBitmap;
  SaveParams: TBitmapCodecSaveParams;
begin
    Image2 := TBitmap.Create;
    sPath := TPath.Combine(TPath.GetSharedCameraPath, '1.jpg');
    TThread.Synchronize(nil,
    procedure
    begin
        Image2.Assign(Image);
        SaveParams.Quality := 100;
        Image2.SaveToFile(sPath, @SaveParams);
        Image2.Free;
    end
    );
    //AddPhoto(1,sPath, lDialogsActive);
    //AddImage(1,sPath, lDialogsActive);
end; 

 

Отредактировал AlexShaman

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От fredhack
      Доброго времени суток подскажите пожалуйста как мне получить ссылку из браузера запущенного через intent в общем суть такова:
      1 запускаю браузер через интент с сылкой http://fire-monkey.ru
      2 на ссылке происходит редирект
      3 я попадаю на http://fire-monkey.ru/forum/
      Как получить последнюю ссылку после редиректа? в данном случае она равна http://fire-monkey.ru/forum/
      var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setData(StrToJURI('http://fire-monkey.ru')); SharedActivity.startActivity(Intent); end;  
    • От A. Sharif
      Возможно ли с помощью intent получить от какого-либо из официальных приложений Вконтакте/Фейсбук/Инст/Google access-token (через кол-бэк метод)?
      Предусматривается ли данная возможность этими приложениями? Если кто делал - приведите, пожалуйста, пример получения результата. 
    • От Wovan2
      Здравствуйте.
      Пишу на Delphi 7. И все было нормально пока не у нас не появился терминал сбора данных на Androide. На Delphi 10 написал простенькое приложение. Но тут встала проблема с занесением данных в поле ввода со сканера штрихкода. В инете нашел, что это дело просто решается интентами. Вообще в windows я подобное делал: вешал процесс, следящий за com-портом, и при появлении данных на нем пересылал их куда надо. В Android должно быть не сложнее. Но я запутался во всей этой куче параметров и функций, передаваемых и получаемых "намерениями".
      В общем вот что мы имеем на данный момент.
      В настройках сканера прописано:
       
      Intent output - android.intent.ACTION_DECODE_DATA Intent string extra - barcode_string На просторах нашел запуск BroadcastReceiver.
      На событие получения сообщения повесил 
      ed.Text := JStringToString(csIntent.getExtras.getString(TJIntent.JavaClass.EXTRA_INTENT)); где csIntent параметр из  BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); Но ничего не выходит. 
      Я подозреваю, что данные из сканера где-то в структуре csIntent. Но, к сожалению, в отладке дальше адреса этой переменной пробраться не получилось.
      Причем строка ed.Text := JStringToString(csIntent.getAction); возвращает в Text название интента: "android.intent.ACTION_DECODE_DATA".
      Помогите разобраться со структурой JIntent. Спасибо.
       
       
    • От Rustam Bikeev
      Здравствуйте. Пришла беда откуда не ждал, Delphi 10.2 не знает библиотеки androidapi.... FMX.Helpers.... и тд и тп. И никак не получается их установить, либо я тупой либо я даже незнаю что может быть. фалы *.dcu лежат в папке ...\lib\android\release.
      Помогите решить проблему очень нужно использовать намерения. уже и переустанавливал платформу android не помогает.

    • От ENERGY
      Подскажите пожалуйста как определить что программа запустилась из AlarmManager?
      Я сделал это так, по аналогии с http://stackoverflow.com/questions/6751564/how-to-pass-a-boolean-between-intents
      В Java коде, который компилиться в итоге в classes.dex (с XE7 не нужен DEX файл, можно подключить Jar файл сразу к проекту!), добавил строчку
      public class AlarmReceiver extends BroadcastReceiver {
          public void onReceive(Context context, Intent intent) {
                  Intent TestLauncher = new Intent();                        
                  TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
                  TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  TestLauncher.putExtra("StartedFromAM", true);
                  context.startActivity(TestLauncher);
          }
      }
      По идее теперь при старте из AlarmManager, должно быть true в активити.
      Из Delphi пытаюсь получить это значение, но всегда возвращает false (0). 
       ShowMessage(SharedActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString );
      И вот так тоже:
      ShowMessage ( MainActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString);
      Не подскажете в чем может быть проблема?

       
    • От Pax Beach
      В Android 6 на Berlin 10.1.1 перестала работать стандартная функция TakePhotoFromCameraAction.

      Иногда работает, иногда нет.
      Поэтому я решил написать нативную замену этой функции. За основу взят пример с портала разработчиков Android.
      Мой пример про видео на базе отправки Intetn смартфону и получение результата в виде другого Intent, отлично работает.
      Но для фотографий этот пример сыпется, после выполнения фотографирования система возвращается в мое приложение и оно вылетает с ошибкой:
      Если заглянуть в исходнки, там все обвязано сообщениями в лог монитора. Последнее сообщение «+ Intent is sent».
      Помогите пожалуйста разобраться, в чем может быть проблема?
       
      PhotoIntent.zip
    • От Pax Beach
      Знающие люди, подскажите пожалуйста, как в iOS одно приложение может запустить другое приложение, как передать картинку в другое приложение, готовое его принять, как при запуске обрабатывать в своем приложении параметры, переданные из другого приложения?
      В Android для этого есть механизм Intent Filter, а как это устроено в iOS, и как с этим работать в RAD Studio?
       
    • От Pax Beach
      Я хочу запустить приложение из другого приложения под iOS и под Android. В зависимости от переданного параметра, который я хочу получить в главной форме, будет открываться соответствующая стартовому параметру форма (Activity в Android).
      Пример: Из приложения "Папа" запустить приложение "Дочка", при этом сообщив "Помой посуду!". И чтобы приложение "Дочка" сообщила "Хорошо, папа" и открыло форму "Мойка посуды". ))) Как ее решить на разных платформах?
      В Windows это делается запуском приложения с соответствующими параметрами, в зависимости от их значения из проекта или главной формы открывается нужная форма.
      В Android для этого сделаны Intent фильтры. Только не понятно, как их обрабатывать в приложениях, написанных в Delphi. Вот как вы это сделали бы?
      И как такое делается в приложениях под iOS, естественно, тоже написанных на Delphi или С++.
       
      UPD 14-09-2016:
      Для Android решение найдено.
      Осталось найти решение для iOS.
    • От Mazzay
      Моё приложение при запуске проверяет номер версии и при необходимости обновляется. Обновляется следующим образом: грузит с сервера и сохраняет на устройстве apk-пакет и запускает его на выполнение. Всё замечательно работало до перехода на Android 5.1. Загрузка пакета осуществляется в папку, возвращаемую GetSharedDownloadsPath. Запуск обновления производится следующим кодом:
      _di_JIntent Intent; _di_Jnet_Uri oUri; _di_JFile oPath; _di_JFile oFile; oPath = TJFile::JavaClass->init(StringToJString(fPath)); // fPath = System::Ioutils::TPath::GetSharedDownloadsPath(); oFile = TJFile::JavaClass->init(oPath, StringToJString(fFile)); // fFile = L"myapp.apk" oUri = TJnet_Uri::JavaClass->fromFile(oFile); Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW); Intent->setDataAndType(oUri, StringToJString(L"application/vnd.android.package-archive")); Intent->setFlags(TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK); SharedActivity()->startActivity(Intent); Application->Terminate(); На Android 5.1 на выполнении этого кода получаю сообщение "... Access denied."
      Не помню, где, нарыл следующее:
      Как установить для файла режим Readable, чтобы его могло читать другое приложение?
       
      P.S. Внешней карты памяти на устройстве нет. Если её вставить, то работает, ибо с ней GetSharedDownloadsPath возвращает путь именно на внешней карте. Втыкание внешней карты пока рассматривается только как временный костыль, но он не очень интересен, так как устройств, на которых работает приложение 18 штук — не хочется покупать 18 карточек.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...