![]() |
|
||||||||||
|
|||||
|
всем привет.
Есть приложение вконтакте. В приложении есть кнопочка "скрин", по нажатию которой должен происходить снимок экрана и постинг скрина на стену выбранному пользователю. с основной частью разобрался: все ништяк, принажатии "скрин" происходит снимок экрана, создается альбом (если его ещё нет с таким названием) и туда добавляется новая фотка. Но вопрос, как этот скрин разместить на стене? Ничего не выходит, открывает просто приложение, где все нелепо дергается, так как action script не идет. Вопрос в том, где сохранить и как передать айди нужной фотки приложению, открываемому со стены, чтобы оно открывало именно ту фотку, которую надо. |
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Цитата:
Id фото для getById будет poster_id + "_" + post_id. |
|
|||||
|
в очередной раз большое спасибо to udaaff! Хоть и изломал голову, но таки решил проблему. ) Приведу код, вдруг кому поможет. Предупреждаю сразу - пишу пока что по ламерски в первом фрэйме. Хоть и осознаю, что .as файлами писать гораздо правильней, лаконичней удобней потом модифицировать программу, но меня почему-то пока что такой способ пугает.. хотя надо...
В данном коде, имхо, полностью раскрыта тема Снятия сэкрана Битовой маски, создания альбома вконтакте и отправки этой битовой маски в качестве фотографии в этот альбом, после чего постинг получившейся фотографии на стену выбранного друга. все дело происходит при нажатии на кнопку scrin vkr - это переменная, в которой лежит класс VkontakteRequest Добавлено через 2 минуты scrin.butScreen.addEventListener(MouseEvent.CLICK, prtScr) scrin.butScreen.useHandCursor = true; scrin.butScreen.buttonMode = true; function prtScr(e:Event):void { var ssil:String;//ссылка на фото var Alboms:XML; //сканирование альбомов var boolAlbom:Boolean = false; //добавлен ли альбом c определенным названием var IDAlbom:String; //айдишник альбома var AlbTitle:String = "My Albom" //назване альбома автоматов var UploadURL:String; //адрес сервера на который грузить фотки; vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetUserSettingsResponse); vkr.sendGetUserSettings(); function onGetUserSettingsResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetUserSettingsResponse); trace('Boolean(e.xml.settings & 512) = '+Boolean(e.xml.settings & 512)) if((Boolean(e.xml.settings & 512)==false)||(Boolean(e.xml.settings & 4)==false)) //проверяем: если у юзера в настройках не стоят галочки "доступ к фотографиям" и "постинг на стену" { wrapper.addEventListener("onSettingsChanged", onSettingsChange); wrapper.external.showSettingsBox(516); //то вызываем окошечко с предложением это сделать function onSettingsChange(e: Object): void { wrapper.removeEventListener("onSettingsChanged", onSettingsChange); _getAlboms(); } } else { //если все ништяк и галки стоят - проверяем альбомы _getAlboms(); } } function _getAlboms():void { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetAlbumResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onGetAlbumError); vkr.sendGetAlbum(); function onGetAlbumResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetAlbumResponse); Alboms = e.xml; trace('\n'+'Список альбомов (Alboms) = '+Alboms) _findCreatedAlbom(); //получаем список альбомов юзера, заносим в переменную и вызываем функц. поиск альбома } function onGetAlbumError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onGetAlbumError); trace('\n'+'Ошибочка вышла') } } function _findCreatedAlbom():void //функция сканирует альбомы на предмет того, создавал ли пользователь уже такой { for(var i:Number=0; i<Alboms..album.length(); i++) //перебираем альбомы { if(Alboms.album[i].title == AlbTitle) { trace('\n'+"В конце же концов!! Хватит создавать альбомы один за другим!") IDAlbom = Alboms.album[i].aid boolAlbom = true; _GetUploadServer(IDAlbom); //если название альбома совпадает с именем нашего альбома ("My Albom"), значит он //уже создан, о чем мы сообщаем в переменную boolAlbom и запускаем функц //для получения ссылки для загрузки нашего скрина в данный альбом } } if(boolAlbom==false) { _createAlb(); //если же boolAlbom так и осталась false, значит альбома с таким названием ещё нет, //что мы тут же исправляем, запуская функцию _createAlb() } } function _createAlb():void { trace("\n"+"создаем альбом"); vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onCreateAlbumResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onCreateAlbumError); vkr.sendCreateAlbum(AlbTitle); } function onCreateAlbumResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onCreateAlbumResponse); trace("ответ, который пришел(?) = "+e.xml) trace('а так же переменная, которая мне чрезвычайно нужна = '+e.xml.album.aid) IDAlbom = e.xml.album.aid _GetUploadServer(IDAlbom); } function onCreateAlbumError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onCreateAlbumError); trace("ответ, который пришел(?) = "+e.message) } function _GetUploadServer(IDA):void { trace("\n"+"получаем адрес для загрузки"); vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetUploadServerResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onGetUploadServerError); vkr.sendGetUploadServer(IDA); } function onGetUploadServerResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetUploadServerResponse); UploadURL = e.xml.upload_url; trace('\n'+'UploadURL ===> '+UploadURL) //ура, получили ссылку на загрузку фоток, сохраняем её в переменную и запускаем функц //выбор друга, при помощ которой пользователь сможет выбрать друга, на стену которого //он хочет загрузить скрин. _viborDruga(); } function onGetUploadServerError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onGetUploadServerError); trace('Errora') } var Wally = wrapper.application.parameters["viewer_id"]; //это на будущее, заносим в переменную Wally viewer_id. //в ней будет хранится id пользователя, на стену которого будет поститься скрин //теперь будет длинная функция Выбор друга. //тут используется некий RaytingerArr //это массив, полученный в результате вызова метода getProfiles(id:String) в другой части программы //чтобы было понятно, что в нем лежит, приведу кусок кода оттуда: /* function onGetProfilesResponse2(e: VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetProfilesResponse2); for(var I:Number=0; I<e.xml..user.length(); I++) { RaytingerArr.push([e.xml.user[i].first_name, e.xml.user[i].photo_medium, e.xml.user[i].last_name, e.xml.user[i].uid]) } */ |
|
|||||
function _viborDruga():void { var forScroll2 = new ForScroll(); //добавляю символ из библиотеки, который состоит из 7-ми элементов //1 - фоновое окошечко - cath. Область захвата среднего колеса //2 - кнопочка ExiT - прсто крестик, как в винде //3 - мувик scrollMaster - внутри него лежит маска, под которой мувик toScroll, который будет под этой маской скроллроваться и куда //будет аттачиться список друзей //4, 5, 6, 7 - кнопочки управления списком raitingerPlay, raitingerPlay1, raitingerPeremot, raitingerPeremot1 //вобщем как сумел объяснил, времени не сильно много вдаваться в подробности. //8 - SCR - ползунок, отображающий положений текста. По хорошему его бы тоже задействовать, чтобы можно было управлять, //но я пока поленился... var podSCR = new PodSCR(); // это просто элемент дизайна, вам не важен addChild(forScroll2); addChild(podSCR) var Sp2 = 17; var Speeder2 = 0; addEventListener(Event.ENTER_FRAME, weeel2) function weeel2(e:Event):void { if(forScroll2.scrollMaster.toScroll.y>0.1) { var minus2 = forScroll2.scrollMaster.toScroll.y-34 forScroll2.scrollMaster.toScroll.y = minus2 } if(forScroll2.scrollMaster.toScroll.y<0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { var plus2 = forScroll2.scrollMaster.toScroll.y+34 forScroll2.scrollMaster.toScroll.y=plus2 } if(forScroll2.scrollMaster.toScroll.y<0.1) { if(_PlayUpScroll==true) { Speeder2++ if(Speeder2>10) { Sp2 = 17*3 trace("timeout UP") } forScroll2.scrollMaster.toScroll.y+=Sp2; } } if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { if (_PlayDownScroll==true) { Speeder2++ if(Speeder2>10) { Sp2 = 17*3 trace("timeout DOWN") } forScroll2.scrollMaster.toScroll.y-=Sp2; } } forScroll2.scrollMaster.SCR.y = (173*(forScroll2.scrollMaster.toScroll.y/(255-forScroll2.scrollMaster.toScroll.height)))+51.4 if((mouseX>225)&&(mouseX<600)&&(mouseY>187)&&(mouseY<487)) { MouseWheel.capture(); //захватываем колесо мыши, чтобы было удобно юзеру прокручивать) //Класс MouseWheel можно скачать, гуглите } else { MouseWheel.release(); //отпускаем колесо мыши } } addEventListener(MouseEvent.MOUSE_WHEEL, scrolling2); function scrolling2(event:MouseEvent):void { forScroll2.scrollMaster.SCR.y = (173*(forScroll2.scrollMaster.toScroll.y/(255-forScroll2.scrollMaster.toScroll.height)))+51.4 if(event.delta >0) //если колесико вверх { if(forScroll2.scrollMaster.toScroll.y<0.1) { forScroll2.scrollMaster.toScroll.y+=textHeight } } if(event.delta <0) //если колесико вниз { if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { forScroll2.scrollMaster.toScroll.y-=textHeight } } } ///////////////////////// ///////////////////////// var FScrollArr2:Array = new Array; for(var i:Number=0; i<RaytingerArr.length; i++) { var fff2 = new FFF(); //это просто мувик-контейнер FScrollArr2.push(new TextField()); forScroll2.scrollMaster.toScroll.addChild(fff2); fff2.addChild(FScrollArr2[i]); FScrollArr2[i].width = 302; FScrollArr2[i].height = textHeight; FScrollArr2[i].x fff2.x=0; fff2.y=i*textHeight; fff2.mouseChildren = false; FScrollArr2[i].defaultTextFormat = fmtTObBB; FScrollArr2[i].background = true; FScrollArr2[i].border = true; FScrollArr2[i].backgroundColor = 0x007D00; FScrollArr2[i].text = RaytingerArr[i][0]+" "+RaytingerArr[i][2]; //имя-фамилия друга под номером i в массиве FScrollArr2[i].selectable = false; fff2.addEventListener(MouseEvent.MOUSE_OVER, scrollButsaOver2) fff2.addEventListener(MouseEvent.MOUSE_OUT, scrollButsaOut2) fff2.addEventListener(MouseEvent.CLICK, scrollButsaClik2) fff2.IDtext = RaytingerArr[i][3] fff2.ind = i } function scrollButsaClik2(e:Event):void { Wally= String(e.target.IDtext); //при нажатии на одного из друзей заносим его id в переменную Wally removeChild(podSCR); removeChild(forScroll2); _upLoadPhoto(UploadURL); //запускаем загрузку фотки в альбом removeEventListener(Event.ENTER_FRAME, weeel2); } function scrollButsaOver2(e:Event):void { FScrollArr2[e.target.ind].backgroundColor = 0x013500; FScrollArr2[e.target.ind].setTextFormat(fmtTRATATA) } function scrollButsaOut2(e:Event):void { FScrollArr2[e.target.ind].backgroundColor = 0x007D00; FScrollArr2[e.target.ind].setTextFormat(fmtTObBB) } /////////////////////////////////////// //////////БУТСЫ фо скролла///////////// ////////////////////////////////////// forScroll2.raitingerPlay1.addEventListener(MouseEvent.CLICK, onPlayUpScroll2) forScroll2.raitingerPlay1.addEventListener(MouseEvent.MOUSE_DOWN, onDOWN_PlayUpScroll2) forScroll2.raitingerPlay2.addEventListener(MouseEvent.CLICK, onPlayDownScroll2) forScroll2.raitingerPlay2.addEventListener(MouseEvent.MOUSE_DOWN, onDOWN_PlayDownScroll2) forScroll2.raitingerPeremot1.addEventListener(MouseEvent.CLICK, onPeremotUpScroll2) forScroll2.raitingerPeremot2.addEventListener(MouseEvent.CLICK, onPeremotDownScroll2) forScroll2.raitingerPlay1.buttonMode = true; forScroll2.raitingerPlay1.useHandCursor = true; forScroll2.raitingerPlay2.buttonMode = true; forScroll2.raitingerPlay2.useHandCursor = true; forScroll2.raitingerPeremot1.buttonMode = true; forScroll2.raitingerPeremot1.useHandCursor = true; forScroll2.raitingerPeremot2.buttonMode = true; forScroll2.raitingerPeremot2.useHandCursor = true; function onDOWN_PlayUpScroll2(e:Event):void { _PlayUpScroll=true; Sp2 = 17; forScroll2.addEventListener(MouseEvent.MOUSE_UP, onUP_PlayUpScroll2) } function onUP_PlayUpScroll2(e:Event):void { forScroll2.removeEventListener(MouseEvent.MOUSE_UP, onUP_PlayUpScroll2) _PlayUpScroll=false; Sp2 = 17; Speeder2=0 } function onDOWN_PlayDownScroll2(e:Event):void { _PlayDownScroll=true; Sp2 = 17; forScroll2.addEventListener(MouseEvent.MOUSE_UP, onUP_PlayDownScroll2) } function onUP_PlayDownScroll2(e:Event):void { forScroll2.removeEventListener(MouseEvent.MOUSE_UP, onUP_PlayDownScroll2) _PlayDownScroll=false; Sp2 = 17; Speeder2=0 } function onPlayUpScroll2(e:Event):void { trace('forScroll2.scrollMaster.toScroll.y = '+forScroll2.scrollMaster.toScroll.y) if(forScroll2.scrollMaster.toScroll.y<(0.1)) { //forScroll.scrollMaster.toScroll.y+=textHeight } } function onPlayDownScroll2(e:Event):void { trace('forScroll2.scrollMaster.toScroll.y = '+forScroll2.scrollMaster.toScroll.y) if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { //forScroll.scrollMaster.toScroll.y-=textHeight } } function onPeremotUpScroll2(e:Event):void { forScroll2.scrollMaster.toScroll.y=0.1 } function onPeremotDownScroll2(e:Event):void { forScroll2.scrollMaster.toScroll.y=0.1-(textHeight*RaytingerArr.length-(textHeight*15)) } forScroll2.ExiT.addEventListener(MouseEvent.CLICK, onExiTScroll2) forScroll2.ExiT.buttonMode = true; forScroll2.ExiT.useHandCursor = true; function onExiTScroll2(e:Event):void { removeChild(podSCR); removeChild(forScroll2); removeEventListener(Event.ENTER_FRAME, weeel2) _upLoadPhoto(UploadURL); //запускаем загрузку фотки. Если пользователь не выбрал друга, //значит Wally осталось равно viewer_id и скрин загрузится на стену пользователя. } forScroll2.ExiT.addEventListener(MouseEvent.MOUSE_OVER, onExiTScrollOver2) forScroll2.ExiT.addEventListener(MouseEvent.MOUSE_OUT, onExiTScrollOut2) function onExiTScrollOver2(e:Event):void { forScroll2.ExiT.gotoAndPlay(2) } function onExiTScrollOut2(e:Event):void { forScroll2.ExiT.gotoAndPlay(4) } }//_viborDruga end |
|
|||||
Вот такая штука... Но даже и этого недостаточно. В начале приложения надо обозначить, что если оно открывается со стены, то нужно образить определенную фотку из определенного альбома определенного юзверя... У меня это реализовано так: var wrapper: Object; this.addEventListener( Event.ADDED_TO_STAGE, onAddedToStage ); //стандартный листенер вконтактовского прелоадера wrapper function onAddedToStage(e: Event): void { var temnovato =new Temno(); addChild(temnovato) wrapper = Object(parent.parent); vkr = new VkontakteRequest(wrapper.application.parameters["viewer_id"], wrapper.application.parameters["api_url"]); trace("wrapper.application.parameters['referrer'] ============>"+wrapper.application.parameters['referrer']) trace("wrapper.application.parameters['post_id'] ============>"+wrapper.application.parameters['post_id']) trace("wrapper.application.parameters['post_id'] ============>"+wrapper.application.parameters['poster_id']) if(wrapper.application.parameters['referrer']=="wall_view_inline") //если со стены { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetByIdResponse); vkr.sendGetById(wrapper.application.parameters['poster_id']+'_'+wrapper.application.parameters['post_id']); function onGetByIdResponse(e: VkontakteEvent): void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetByIdResponse); trace('e.xml.photo[0].src_big = '+e.xml.photo[0].src_big) var scrloader = new Loader(); var scrloaderContext2:LoaderContext = new LoaderContext(); scrloaderContext2.checkPolicyFile = true; var scrPRErequest:URLRequest = new URLRequest(e.xml.photo[0].src_big); scrloader.load(scrPRErequest, scrloaderContext2); scrloader.contentLoaderInfo.addEventListener(Event.COMPLETE,SCRcomImage); function SCRcomImage(e:Event):void { removeChild(temnovato); addChild(scrloader); scrloader.width = 800; scrloader.height = 600; } } } else { removeChild(temnovato); } wrapper.external.setTitle('Moе приложение'); wrapper.external.scrollWindow(100, 500); wrapper.addEventListener("onApplicationAdded", onApplicationAdded); wrapper.external.showInstallBox(); } Но вот осталась все-таки одна проблемка... С кодировками. Почему-то, если нузываю альбом по русски то получается incorrect signature, потому что отсылается почему-то абракадабра полная.. хотя по идее все должно быть тип-топ, ведь по умолчанию всегда UTF-8, и контакт должен понимать эту кодировку.. Эта проблема не только тут, точно так же и с пояснениями к альбому - если по русски, что-то там с кодировками. Я пробовал escape().. в этом случае в запросе уже показывается не абракадабра, но все равно incorrect signature... ( Что-тоя видимо не так где-то делаю... Последний раз редактировалось ZergMaster; 08.04.2010 в 15:13. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
ZergMaster, encodeURI
/**************************************************************************/ /* Создание альбома у пользователя */ /**************************************************************************/ public function createAlbum(requestData){ var signatureForMD5:String = wrapper.application.parameters.viewer_id + "api_id=" + wrapper.application.parameters.api_id + "method=photos.createAlbum" + "test_mode="+testMode + "title=" + requestData.albumName + "v=2.0" + GlobalParameters.appCode; var signatureMD5:String = convertorMD5.encrypt(signatureForMD5); var requestString:String = wrapper.application.parameters.api_url + "?api_id=" + wrapper.application.parameters.api_id + "&method=photos.createAlbum" + "&sig=" + signatureMD5 + "&test_mode="+testMode + "&title=" + encodeURI(requestData.albumName) + "&v=2.0" ; connectToURL(requestString,"createAlbum"); } |
|
|||||
|
все равно - Incorrect signature
может я что-то не понял.. я просто написал Последний раз редактировалось ZergMaster; 08.04.2010 в 18:45. |
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Запрос составлять нужно с помощью URLVariables и таких проблем не будет.
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
ZergMaster, я специально кусок кода привел - encodeURI только в запросе к серверу
В том тексте, что идет в МД5, encodeURI нет. Там просто русское название. Последний раз редактировалось mikhailk; 08.04.2010 в 19:17. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|