0

Я новичок в разработке Windows-телефонов, и мне нужно подключить к нему приложение, используя phonegap/cordova. Большая часть моего кода работает для Android/iOS, а также для winphone, но на этом FileOpenPicker я заблокирован. Я использую winjs 2.1, и я хотел бы подготовить сценарий, который будет вызываться, когда я нахожусь на странице, нуждающейся в этой функции.FileOpenPicker WP8.1 - Как сделать

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

В моем HTML файл я объявляю:

<script src="//Microsoft.Phone.WinJS.2.1/js/base.js"></script> 
<script src="//Microsoft.Phone.WinJS.2.1/js/ui.js"></script> 
<script type="text/javascript" src="js/default.js"></script> 

И Это мой default.js, файл я использую на странице, где FileOpenPicker должны называться.

(function() { 
"use strict"; 

var app = WinJS.Application; 
var activation = Windows.ApplicationModel.Activation; 

app.onloaded = function (args) { 
    var activationKind = args.detail.kind; 

    document.getElementById("btnSnap").addEventListener("click", pickSinglePhoto); 

    if (activationKind === Windows.ApplicationModel.Activation.ActivationKind.pickFileContinuation) { 
     continueFileOpenPicker(options.activatedEventArgs); 
    }   
}; 

function pickSinglePhoto() { 
    // Clean scenario output 
    WinJS.log && WinJS.log("", "sample", "status"); 
    console.log("in pickSinglePhoto"); 

    // Create the picker object and set options 
    var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); 
    openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail; 
    openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; 
    // Users expect to have a filtered view of their folders depending on the scenario. 
    // For example, when choosing a documents folder, restrict the filetypes to documents for your application. 
    openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]); 

    // Open the picker for the user to pick a file 
    openPicker.pickSingleFileAndContinue(); 
} 

// Called when app is activated from file open picker 
// eventObject contains the returned files picked by user 
function continueFileOpenPicker(eventObject) { 
    console.log("in continueFileOpenPicker"); 
    var files = eventObject[0].files; 
    var filePicked = files.size > 0 ? files[0] : null; 
    if (filePicked !== null) { 
     // Application now has read/write access to the picked file 
     WinJS.log && WinJS.log("Picked photo: " + filePicked.name, "sample", "status"); 
    } else { 
     // The picker was dismissed with no selected file 
     WinJS.log && WinJS.log("Operation cancelled.", "sample", "status"); 
    } 
} 

app.start(); 
})(); 

К сожалению, это не работает. Я не могу войти в continueFileOpenPicker, потому что флаг activationKind всегда не определен. Я уверен, что я должен использовать app.onactivated вместо app.onloaded, но в первом случае я не могу войти в функцию.

Я уже пробовал функцию pickSinglePhoto и, похоже, работает, но после выбора не могу вернуться на страницу после сбоя приложения, потому что я не могу выбрать и использовать функцию в других файлах javascript как грубый.

Любой ключ?

ответ

0

Я, наконец, получил его. Это мое рабочее решение, основанное на официальном ответе на вопросы о подключении камеры Cordova JARA (link).

  1. Используйте официальный плагин камеры Кордова (link)
  2. Основные файлы: index.html, index.js, new.html, new.js, wp_get_image.js, utils.js.

Во-первых, в index.html (моя главная страница) Я объявил wp_get_image.js сценарий:

<script type="text/javascript" src="js/localstoragedb.min.js"></script> 
<script type="text/javascript" src="js/utils.js"></script> 
<script type="text/javascript" src="js/wp_get_image.js"></script> 
<script type="text/javascript" src="js/index.js"></script> 

Помните:

«Короче говоря, выбор изображения из галереи причин приложение для приостановки до изображение будет выбрано, а затем возобновлено с начальной страницы (как определено в config.xml). Если вы вызвали getPicture с другой страницы, это приведет к перезагрузке и открытию всего приложения rt page. Кроме того, обратные вызовы к getPicture также получить уничтожены в этом случае, так что вы никогда не будете получить какой-либо результат с плагином.»

Итак, мне нужен крюк на индексную страницу, чтобы перехватить функцию обратного вызова от камеры Это мой wp_get_image.ЯШИ:

var goto_new_page_winphone = ""; 

(function() { 
    "use strict"; 

    var app = WinJS.Application; 
    var activation = Windows.ApplicationModel.Activation; 

    app.onactivated = function (args) { 

     if (args.detail.kind === activation.ActivationKind.launch) { 
      var that = this; 

      // Init: 
      goto_new_page_winphone = ""; 
      localStorage.setItem("image_url_winphone", ""); 
     } 

     if (args && args.detail.kind === activation.ActivationKind.pickFileContinuation) { 
      continueFileOpenPicker(args); 
     }; 

     args.setPromise(WinJS.UI.processAll().then(function() { 
      // Text 
     })); 
    }; 

    function continueFileOpenPicker(eventObject) { 

     console.log("in continueFileOpenPicker"); 
     var filePicked = eventObject.detail.files[0]; 
     var msgBox; 
     if (filePicked !== null) { 
      // Save filePicked.path in localstorage: 
      localStorage.setItem("image_url_winphone", filePicked.path); 
     } else { 
      msgBox = new Windows.UI.Popups.MessageDialog("Operation cancelled."); 
      msgBox.showAsync(); 
     } 
     // Save back page: 
     goto_new_page_winphone = read_backpage(); 
    }; 
app.start(); 
})(); 

Я использую LocalStorage, чтобы сохранить URL изображения и локальные переменный для хранения страницы, с которой я пришел (страница я назвала new.html). Функция read_backpage() объявляется в моем файле utils.js, в котором я отслеживаю посещаемые пользователем страницы. Итак, после действия на странице new.html, где я делаю снимок, система возвращает меня на индексную страницу. Там мне нужно прочитать страницу, из которой я пришел. Так что в моем index.js:

window.addEventListener("load", load, false); 

function load() { 
    if (device.platform != undefined) { 
     var plat = device.platform; 
     plat = plat.substring(0, 3); 
     if (plat.toLowerCase() == "win") { 
      if (goto_new_page_winphone && goto_new_page_winphone.length > 0) { 
       window.location.href = goto_new_page_winphone; 
      } 
     } 
    } 
} 

внимание маи: поток: $ (документ) .ready в index.js -> app.onactivated в wp_get_image.js -> нагрузка в index.js. Поэтому не помещайте функцию goto (window.location.href = goto_new_page_winphone) внутри $ (document) .ready, иначе у вас будет var goto_new_page_winphone null, и вы не можете двигаться.

Ну, на данный момент вы выбрали изображение на странице new.html, вернулись к index.html, но теперь вы можете надеяться перенаправить приложение на страницу, объявленную в goto_new_page_winphone (в моем случае страница называется new.html).

В new.js (сценарий связан с new.html) Я поднимаю путь изображения:

if (is_winphone) { 
     var image_url = localStorage.getItem("image_url_winphone"); 
     if (image_url && image_url.length > 0) { 
      upload_img("newprofile", image_url, function (urlimg) { 
       // Reset localstorage var: 
       localStorage.setItem("image_url_winphone", ""); 
       if (urlimg.length > 0) { 
        urlimg = urlimg.replace(/\\/g, ''); 
        console.log(urlimg); 
        // Save remote url in my localstorage 
        wp_save_img_url(urlimg); 
       } 
      }); 
     } 
    } 

В моем случае, я отправить изображение к моему серверу через upload_img FUNC а ответ сервера с удаленным url, который я сохраняю для своих целей. Загрузить img func - это простая функция, которую вы можете создать, следуя документу «Файл Tranfer Plugin».

0
(function() { 
"use strict"; 

var app = WinJS.Application; 

app.onloaded = function (args) { 

document.getElementById("btnSnap").addEventListener("click", pickSinglePhoto); 
} 

//This is where the app should validate the ActivationKind 
app.onactivated = function (args) { 

var value = args.detail.kind; 

if (value ===  Windows.ApplicationModel.Activation.ActivationKind.pickFileContinuation) 
{ 
continueFileOpenPicker(args); 
} 

}

function pickSinglePhoto() { 

console.log("in pickSinglePhoto"); 

var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); 

openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail; 

openPicker.suggestedStartLocation =  Windows.Storage.Pickers.PickerLocationId.picturesLibrary; 

openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]); 

openPicker.pickSingleFileAndContinue(); 

} 


function continueFileOpenPicker(eventObject) 
{ 
var imagen = eventObject.detail.files[0]; 

//whatch the properties of this object in the debuger 
console.log(imagen.displayName); 


} 


app.start(); 
})();  

Этот код будет работать для вас.