質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Android

    7385questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

野良アプリのアップデート機能について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,913

WestField

score 12

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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);

としてやらないとインストーラが停止されるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Android

    7385questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。