野良アプリのアップデート機能について
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 3,239
Android7.0に対応させる為に四苦八苦しております。
Android6の時は上手く行っていたのですが、7になってからファイルの扱いが変わったらしく、エラーでアップデートが出来なくなりました。
[DownloadAPK]
public class DownloadAPK extends AsyncTask<String,Integer,String> {
private String TAG = "DownlaodAPK";
private Activity mActivity;
private Context mContext;
private BaseSession session = BaseSession.getInstance();
private Utility util = new Utility();
private final int TIMEOUT_READ = 1000000;
private final int TIMEOUT_CONNECT = 1000000;
private final int BUFFER_SIZE = 1024;
private InputStream inputStream;
private FileOutputStream fileOutputStream;
private BufferedInputStream bufferedInputStream;
private byte[] buffer = new byte[BUFFER_SIZE];
private File mOutput;
private int fileLength;
private String mOutputFilePath;
private String apkName;
private String dlURL;
private ProgressDialog mProgress;
public DownloadAPK(String apkName){
String url = AppConfig.SERVER_URL_T;
switch(AppConfig.APP_ATTRIBUTE){
case "test":
url = AppConfig.APPDL_URL_T;
break;
case "release":
url = AppConfig.APPDL_URL_R;
break;
}
mActivity = session.getmActivity();
mContext = session.getmContext();
dlURL = url + "/" + apkName;
mProgress = new ProgressDialog(mContext);
mProgress.setMessage("File Downloading");
mProgress.setIndeterminate(false);
mProgress.setMax(100);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgress.setCanceledOnTouchOutside(false);
try {
File cacheDir = mActivity.getCacheDir();
mOutput = File.createTempFile("apk", ".apk", cacheDir);
Log.d(TAG, "--R80-->" + mOutput.getAbsolutePath());
}catch (IOException e){
e.printStackTrace();
}
}
@Override
protected void onPreExecute(){
super.onPreExecute();
mProgress.show();
}
@Override
protected String doInBackground(String... params){
try{
connect();
} catch(IOException e) {
Log.d(TAG, "--ConnectError:" + e.toString());
}
if(bufferedInputStream != null){
try{
int len;
long total = 0;
while((len = bufferedInputStream.read(buffer)) != -1){
total += len;
publishProgress((int) (total * 100 / fileLength));
fileOutputStream.write(buffer,0,len);
}
} catch(IOException e) {
Log.d(TAG, e.toString());
}
}else{
Log.d(TAG, "--bufferedInputStream == null");
}
try{
close();
} catch(IOException e) {
Log.d(TAG, "--CloseError:" + e.toString());
}
return null;
}
@Override
protected void onPostExecute(String result){
mProgress.dismiss();
installAPK();
}
@Override
protected void onProgressUpdate(Integer... progress){
super.onProgressUpdate(progress);
mProgress.setProgress(progress[0]);
}
private void connect() throws IOException {
URL apkURL = new URL(dlURL);
HttpURLConnection conn;
conn = (HttpURLConnection) apkURL.openConnection();
conn.setReadTimeout(TIMEOUT_READ);
conn.setConnectTimeout(TIMEOUT_CONNECT);
fileLength = conn.getContentLength();
inputStream = conn.getInputStream();
bufferedInputStream = new BufferedInputStream(inputStream, BUFFER_SIZE);
fileOutputStream = new FileOutputStream(mOutput);
}
private void close() throws IOException {
fileOutputStream.flush();
fileOutputStream.close();
bufferedInputStream.close();
}
private void installAPK(){
if(mOutput == null || !mOutput.exists()){
Log.d(TAG + "R149","Not Found File");
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
//Uri dataUri = Uri.fromFile(mOutput);
Uri dataUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileprovider",mOutput);
Log.d(TAG,"--R179-->" + dataUri);
intent.setDataAndType(dataUri, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(intent);
}
private void deleteAPK(){
try{
File cacheDir = mActivity.getExternalCacheDir();
File[] cacheFiles = cacheDir.listFiles();
for (int i = 0; i < cacheFiles.length; i++) {
if(cacheFiles[i].getName().endsWith(".apk")){
cacheFiles[i].delete();
}
}
}catch(Exception e){
}
}
}
[AndroidManifest]
<!--File provider -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>
[file_path]
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="shareFiles" path="share/"/>
<cache-path name="shareCache" path="" />
</paths>
上記のようなコードを書いているのですが、どうもこれだとパッケージインストーラーを停止しましたとなり、
上手くインストールが出来ませんでした。
恐らく、ダウンロードしたファイルが渡せていないのだと思います。
お知恵をお貸し頂ければ幸いです。
宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
+1
解決致しました。
Marshmallowの時はIntentに渡す際に
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
上記のよにしていてもインストーラーが走ったのですが、
Nougatには
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
としてやらないとインストーラが停止されるようです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる